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

为什么Python中super()无法在子类中访问父类的实例变量?

为什么super()无法访问父类方法中定义的实例变量

核心原因非常明确:

  • super() 返回的不是父类实例,而是Python的MRO(方法解析顺序)代理对象,它的属性查找范围仅覆盖类层级定义的属性(包括类变量、类方法、实例方法),不会检索绑定在当前实例上的实例属性。

第一个测试报错的原因

你在父类P的m1方法中执行self.b=10时,这里的self指向的是你创建的子类C的实例对象,b是直接绑定到这个实例身上的属性,不属于父类P的类层级属性。super()代理不会去实例自身的属性空间查找,所以调用super().b会触发AttributeError。

第二个测试输出的逻辑

你在父类P中定义了类变量a=888,这是属于P类的类层级属性,所以super().a会匹配到这个值输出888;
执行super().m1()时,方法内的self.a=10是给当前子类实例新增了一个实例属性a,Python访问属性时实例属性优先级高于类属性,所以self.a输出10。


补充使用建议

所有通过self.xxx赋值的属性,不管赋值逻辑写在父类还是子类的方法里,本质都属于当前实例本身,直接用self.xxx访问即可,不需要通过super()。super()仅适用于两种场景:需要调用被子类重写的父类方法,或者需要明确访问父类定义的类属性。

内容的提问来源于stack exchange,提问作者Deepak Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:39:03