You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

父类含实例属性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'。

核心原因

  1. 类属性与实例属性的本质区别

    • P.a是类属性,属于P类本身,存储在类的命名空间中;
    • self.b是实例属性,仅绑定在具体的实例对象(self)上,不属于父类P的类命名空间。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:33:24