父类含实例属性b,调用super()为何触发AttributeError?
问题解析:super()调用实例属性报错的原因
问题场景
父类P的__init__中定义实例属性self.b = 20,子类C继承自P,在自身__init__中先给self.b赋值999,再调用super().__init__()。调用super().a能正常输出父类的类属性10,但调用super().b时触发AttributeError: 'super' object has no attribute 'b'。
核心原因
类属性与实例属性的本质区别
P.a是类属性,属于P类本身,存储在类的命名空间中;self.b是实例属性,仅绑定在具体的实例对象(self)上,不属于父类P的类命名空间。
super()的属性查找逻辑
super()返回的是父类的代理对象,它的属性查找优先级是:- 优先从父类的类命名空间中查找属性,而非实例对象的命名空间。
super().a能找到值,是因为父类P确实有a这个类属性;而super().b找不到,是因为父类P的类本身没有定义b这个类属性——b只是父类在初始化时给实例绑定的属性,和父类的类本身无关。
验证与修正
如果要访问父类初始化的实例属性,直接使用self.b即可,因为实例属性都存储在当前实例对象中。修正后的代码片段:
class P: a = 10 def __init__(self): self.b = 20 class C(P): a = 888 def __init__(self): self.b = 999 super().__init__() print(super().a) print(self.b) # 改为self.b c = C()
运行后会输出:
10 20
内容的提问来源于stack exchange,提问作者Tejaswita
相关产品推荐
相关产品推荐

