首页 > 解决方案 > Python更新类变量

问题描述

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

程序.py

from classB import B
myClass = B(7)
myClass.print__()
myClass.bbb = 8
print(myClass.bbb)
myClass.print__()

类A.py

class A:
    def __init__(self, a):
        self.aaa = a

    def print_(self):
        print(self.aaa)

类B.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() 这样的函数来解决这个问题,但是你能解释一下为什么会发生这种情况,以及一个更好的解决方案吗?

标签: pythonpython-3.xclass

解决方案


您对更新功能是正确的。在您的情况下,它将是(在 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]

但这是相当先进的。你可以在这里阅读


推荐阅读