我把这个问题简化成这样。
program.py
from classB import B
myClass = B(7)
myClass.print__()
myClass.bbb = 8
print(myClass.bbb)
myClass.print__()classA.py
class A:
def __init__(self, a):
self.aaa = a
def print_(self):
print(self.aaa)classB.py
from classA import A
class B:
def __init__(self, bb):
self.bbb = bb
self.Aclass = A(self.bbb)
def print__(self):
self.Aclass.print_()在program.py中,我创建了一个classB实例myClass,并使用7初始化了它。如果是这样的话,那么将从classB.py创建一个classA实例Aclass,并且用7初始化它,所以当我调用print__()时,它显示Aclass也是用7初始化的。
这里的问题是当我将myClass.bbb更新为8时,我也希望Aclass.aaa是8,但它没有。
我可以通过创建另一个像update_varA()这样的函数来解决这个问题,但是请您解释一下为什么会发生这种情况,并给出更好的解决方案。
发布于 2018-06-20 19:27:35
关于update函数,您是正确的。在您的例子中,它将是(在classB.py中)
class B:
def update_value(self, new_value):
self.bbb = new_value
self.AClass.aaa = new_value
[... all the other functions]另一种方法是直接在主例程(program.py)中设置值。
myClass.AClass.aaa = 8就会变戏法。
如果您想深入一点,也可以重写__setattr__()函数。基本上,当你做这样的事情
myClass.bbb = 8 python在引擎盖下这样做:
myClass.__setattr__('bbb', 8)myClass实际上是这个类的一个实例,所以这个名称有点误导。不过,您可以重写setattr():
class B:
def __setattr__(self, name, value):
if name=='bbb':
self.bbb = new_value
self.AClass.aaa = new_value
else:
super().__setattr__(name, value)
[... all the other functions]但这相当先进。你可以读到它,这里
https://stackoverflow.com/questions/50955336
复制相似问题