Python更新类变量

时间:2018-06-20 19:03:31

标签: python python-3.x class

我已经简化了这样的问题。

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())来解决此问题,但是请您解释一下为什么会发生这种情况,以及对此有更好的解决方案吗?

1 个答案:

答案 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

的信息