Python 3.6:子类无需显式调用父类方法如何访问其变量?
问题与解决方法
你想要在父类中定义类变量并让子类直接操作,但当前代码运行出现AttributeError,先看你的原代码:
class Parent(): def unique_to_parent(self): self.c = "D" class Child(Parent): def blah(self): print(self.c) if __name__ == '__main__': thing = Child() thing.blah()
运行后报错:
Traceback (most recent call last): File "./test.py", line 16, in <module> thing.blah() File "./test.py", line 12, in blah print(self.c) AttributeError: 'Child' object has no attribute 'c'
问题根源
你混淆了类变量和实例变量的区别:
- 你在
unique_to_parent方法里用self.c = "D"定义的是实例变量,不是类变量,这个变量只会在调用该方法后,才会绑定到当前实例上。 - 子类继承父类后,只是继承了父类的方法和类变量,但父类的实例方法不会自动执行,所以你的
Child实例在没调用unique_to_parent之前,根本没有c这个属性。
正确实现:定义类变量
如果你的需求是在父类设置类变量,直接在父类的类层级定义即可,这样子类会自动继承这个类变量,无需额外调用方法:
class Parent(): # 直接定义类变量 c = "D" class Child(Parent): def blah(self): # 可以直接访问继承来的类变量 print(self.c) # 也可以通过类名访问,更明确是类变量 # print(Parent.c) # print(Child.c) if __name__ == '__main__': thing = Child() thing.blah() # 输出 D
若需在实例方法初始化变量但不想修改子类__init__
如果因为某些原因必须在父类的方法里初始化变量,但不想在子类的__init__中处理,可以让父类的__init__方法来完成初始化,这样创建子类实例时会自动调用父类的构造方法:
class Parent(): def __init__(self): self.c = "D" class Child(Parent): def blah(self): print(self.c) if __name__ == '__main__': thing = Child() thing.blah() # 输出 D
这样既不用在子类显式调用父类方法,也能让实例拥有c属性,因为创建实例时会自动执行父类的构造方法。
内容的提问来源于stack exchange,提问作者Lucky
相关产品推荐
相关产品推荐

