Python类变量作用域问题:如何通过B类方法更新AA实例va?
问题分析与解决方案
首先得点明你遇到的核心问题:你的BB类在__init__里自己创建了一个AA实例self.e,这个实例和你在Jupyter Notebook里定义的va完全是两个独立的对象。所以你调用vb.setvarB('new msg')时,修改的只是BB内部那个AA实例的myvar,和外面的va没有任何关联,自然输出不会改变。
另外先提个小bug:你A.py里的setvarA方法写错了,参数是val但赋值时用了var,会触发NameError,得修正成这样:
# A.py 修正后的setvarA方法 def setvarA(self, val): self.myvar = val
接下来给你两种可行的解决方案:
方案一:初始化BB时传入外部的AA实例
修改B.py的代码,让BB在创建时接收一个外部的AA实例,而非自行新建:
# B.py import A as a class BB(): def __init__(self, aa_instance): # 保存外部传入的AA实例 self.e = aa_instance def setvarB(self, msg): self.e.setvarA(msg)
然后在Jupyter Notebook中这样使用:
import A as a import B as b va = a.AA() # 把va传入BB的构造函数,让BB操作这个实例 vb = b.BB(va) print(va.getvarA()) # 输出 MSG from AA vb.setvarB('new msg') print(va.getvarA()) # 现在会输出 new msg
方案二:给setvarB方法添加参数,传入要修改的AA实例
如果不想在初始化BB时就绑定实例,也可以在调用setvarB时传入目标AA实例:
# B.py import A as a class BB(): def __init__(self): # 不需要默认实例的话可以留空 pass def setvarB(self, aa_instance, msg): aa_instance.setvarA(msg)
Notebook中的使用方式:
import A as a import B as b va = a.AA() vb = b.BB() print(va.getvarA()) # 输出 MSG from AA # 把va和要设置的消息一起传给setvarB vb.setvarB(va, 'new msg') print(va.getvarA()) # 输出 new msg
这两种方式的核心都是让BB类能够访问到你在Notebook里创建的va实例,而非操作它内部的独立实例,这样就能实现你想要的修改效果了。
内容的提问来源于stack exchange,提问作者olivier dadoun
相关产品推荐
相关产品推荐

