python - 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() 这样的函数来解决这个问题,但是你能解释一下为什么会发生这种情况,以及一个更好的解决方案吗?
解决方案
您对更新功能是正确的。在您的情况下,它将是(在 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]
但这是相当先进的。你可以在这里阅读
推荐阅读
- javascript - 如何在 MEAN 堆栈中设置 HTTP 标头键/值对
- javascript - 制作 Javascript 简单的幻灯片
- php - Php - 这个 %7Barticle-%3Eid%7D 在 Codeigniter Php 中是什么意思
- r - 看起来像融化数据的 data.frame 上的 Facet_wrap
- mysql - SQL 中的高级循环
- javascript - 如何在本机反应中向堆栈图表添加褪色背景
- html - 删除表单中的单选按钮
- templates - 使用 ES6 文字模板的动态 AQL 查询
- c3.js - C3js - 仅在图表的最后一点显示圆圈
- pandas - 用python操作csv文件的索引