Python 2.7:非继承场景下内部类如何访问外部类变量?
Python 2.7 内部类访问外部类变量的正确姿势(非继承版)
嘿,我太懂你踩的这个坑了!在Python 2.7里,内部类并不会自动绑定外部类的实例,所以你直接去访问外部类的myVar才会爆出AttributeError: myParent instance has no attribute 'myVar'的错误。而且你明确说不想让myChild继承myParent,完全没问题,咱们用非继承的方式就能解决。
先猜猜你大概写了类似这样的错误代码:
class myParent(object): def __init__(self): self.myVar = "Hello from Parent" self.child = self.myChild() # 这里没把外部类实例传给内部类 class myChild(object): def print_var(self): print(self.myVar) # self指向的是myChild实例,根本没有myVar obj = myParent() obj.child.print_var()
错误原因
myChild的实例是独立存在的,它不知道自己属于哪个myParent实例。你在myChild里用self.myVar时,self指的是myChild自己的实例,自然找不到myVar这个属性。
正确解法1:给内部类传入外部类实例引用
这是最常用的方法——创建内部类实例时,把外部类的self传进去,让内部类保存这个引用,之后通过引用访问外部类的变量:
class myParent(object): def __init__(self): self.myVar = "Hello from Parent" # 创建内部类时,把当前myParent实例传进去 self.child = self.myChild(self) class myChild(object): def __init__(self, parent_instance): # 保存外部类实例的引用 self.parent = parent_instance def print_var(self): # 通过保存的引用访问外部类的实例变量 print(self.parent.myVar) obj = myParent() obj.child.print_var() # 输出: Hello from Parent
正确解法2:访问外部类的类变量(如果适用)
如果你的myVar是属于整个myParent类的类变量,而不是某个实例独有的,那可以直接通过外部类名访问,不需要传实例:
class myParent(object): myVar = "Hello from Parent Class" # 类变量,属于整个类 class myChild(object): def print_var(self): # 直接通过外部类名访问类变量 print(myParent.myVar) obj = myParent() obj.child = myParent.myChild() obj.child.print_var() # 输出: Hello from Parent Class
这两种方法都完全满足你“不让myChild继承myParent”的需求,你可以根据myVar是实例变量还是类变量来选对应的方式~
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

