首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python更新类变量

Python更新类变量
EN

Stack Overflow用户
提问于 2018-06-20 19:03:30
回答 1查看 5.2K关注 0票数 1

我把这个问题简化成这样。

program.py

代码语言:javascript
复制
from classB import B
myClass = B(7)
myClass.print__()
myClass.bbb = 8
print(myClass.bbb)
myClass.print__()

classA.py

代码语言:javascript
复制
class A:
    def __init__(self, a):
        self.aaa = a

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

classB.py

代码语言:javascript
复制
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()这样的函数来解决这个问题,但是请您解释一下为什么会发生这种情况,并给出更好的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-20 19:27:35

关于update函数,您是正确的。在您的例子中,它将是(在classB.py中)

代码语言:javascript
复制
class B:
    def update_value(self, new_value):
        self.bbb = new_value
        self.AClass.aaa = new_value

    [... all the other functions]

另一种方法是直接在主例程(program.py)中设置值。

代码语言:javascript
复制
myClass.AClass.aaa = 8

就会变戏法。

如果您想深入一点,也可以重写__setattr__()函数。基本上,当你做这样的事情

代码语言:javascript
复制
myClass.bbb = 8  

python在引擎盖下这样做:

代码语言:javascript
复制
myClass.__setattr__('bbb', 8)

myClass实际上是这个类的一个实例,所以这个名称有点误导。不过,您可以重写setattr():

代码语言:javascript
复制
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]

但这相当先进。你可以读到它,这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50955336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档