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

Python多继承问题:为何无法访问超类的超类实例变量?

问题分析与解决方案

嘿,我来帮你把这个问题掰明白~

首先,咱们先揪出核心问题:你的B类构造函数没有调用父类A的__init__方法,这才是导致c.var1拿不到值的根本原因。

为什么会这样?

看你最初的代码:

class B(A): 
    def __init__(self): 
        self.var2=10

这里B的__init__只初始化了自己的var2,完全没管父类A的初始化逻辑。当你在C里调用super().__init__()时,其实是调用了B的__init__,但B不会帮你初始化A的var1,所以C的实例自然没有这个属性。

至于你尝试的super().super().__init__(),这是Python里不存在的写法——super()返回的是一个代理对象,它没有super()方法,直接这么写会触发属性错误。

而你补充的那段代码里,B的__init__加上了super().__init__(),所以B的实例能拿到A的var1,这是因为B正确完成了父类的初始化。

怎么解决?

有两种靠谱的方式:

方式1:修复B类的继承逻辑(推荐)

让B的__init__调用父类A的构造函数,这样整个继承链就能正常传递初始化逻辑:

class A: 
    def __init__(self): 
        self.var1=5
class B(A): 
    def __init__(self): 
        self.var2=10
        super().__init__()  # 加上这行,触发A的初始化
class C(B): 
    def __init__(self):
        self.var3=20
        super().__init__() 
c=C()
print(c.var1)  # 现在能正常输出5啦

方式2:在C里直接调用A的构造函数(不推荐,破坏封装)

如果实在不想修改B类,也可以在C的__init__里直接调用A的__init__,但这种方式跳过了继承链,不是最佳实践:

class A: 
    def __init__(self): 
        self.var1=5
class B(A): 
    def __init__(self): 
        self.var2=10
class C(B): 
    def __init__(self):
        self.var3=20
        super().__init__()
        A.__init__(self)  # 直接初始化A的属性
c=C()
print(c.var1)  # 也能输出5

总结一下

Python的super()是沿着**方法解析顺序(MRO)**去查找父类方法的,只要每个子类都正确调用super().__init__(),就能保证所有父类的构造逻辑都被执行,属性也就都能正常继承啦。

内容的提问来源于stack exchange,提问作者Ash Upadhyay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:45:10