Python嵌套类:如何通过内部类修改外部类实例属性?
解决Python内部类访问/修改外部类实例属性的问题
嘿,我懂你现在卡在哪了——你的Inner类目前完全是个独立的存在,根本没和Outer的实例绑定到一起,所以它找不到some_var属性简直太正常了。咱们一步步把这个问题搞定:
问题根源
你当前的Inner实例完全不知道自己属于哪个Outer对象,print_some_var里的self指的是Inner自己的实例,不是Outer的,自然会抛出AttributeError。要让Inner能操作Outer的属性,核心就是得让它持有外部类实例的引用。
修正后的完整代码
class Outer: def __init__(self): self.some_var = 1 # 创建Inner时把当前Outer实例传递进去 self.Inner = Inner(self) class Inner: def __init__(self, outer_instance): # 把外部类实例的引用保存下来 self.outer = outer_instance def print_some_var(self): # 通过保存的外部实例引用读取属性 print("I'm Inner's method, printing:", self.outer.some_var) def change_some_var(self, n): # 通过外部实例引用修改属性 self.outer.some_var = n o = Outer() print("Printing directly.", o.some_var) o.Inner.print_some_var() o.Inner.change_some_var(5) o.Inner.print_some_var() # 额外验证外部实例的属性确实被修改了 print("After change, outer var:", o.some_var)
关键改动说明
- 传递外部实例引用:在
Outer的__init__方法里创建Inner时,把self(也就是当前Outer的实例)传给Inner的构造函数,让两者建立关联。 - 保存引用到Inner内部:
Inner的__init__方法接收外部实例,把它存在自己的self.outer属性里,这样后续的方法就能随时访问到外部类的实例了。 - 调整属性访问路径:把原来的
self.some_var改成self.outer.some_var,这样就能正确读取和修改外部类实例的属性了。
运行这段代码后,你会得到符合预期的输出:
Printing directly. 1 I'm Inner's method, printing: 1 I'm Inner's method, printing: 5 After change, outer var: 5
内容的提问来源于stack exchange,提问作者Don Jhoe
相关产品推荐
相关产品推荐

