我已经简化了这样的问题。
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())来解决此问题,但是请您解释一下为什么会发生这种情况,以及对此有更好的解决方案吗?
答案 0 :(得分:1)
您对更新功能是正确的。在您的情况下,它将是(在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]
但这非常先进。您可以阅读有关here
的信息