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

Python使用super()无法访问第二个父类变量的问题排查

问题原因

你的问题出在Python多继承的**方法解析顺序(MRO)**和super()的调用逻辑上:

  • 在Trash.__init__里调用super().__init__()时,它只会按照MRO顺序调用第一个父类Core的__init__方法。
  • 但Core的__init__没有用super()继续触发下一个父类Extra的初始化逻辑,导致Extra的__init__完全没执行,实例自然不会有b_from_Extra这个属性。
解决方案

有两种常用的修复方式:

方式一:让所有父类的__init__接入super()调用链(推荐)

这种方式贴合Python多继承的设计规范,让MRO自动处理父类的初始化顺序:

class Core:
    def __init__(self):
        super().__init__()  # 添加该行,继续调用MRO中的下一个类的__init__
        self.a_from_Core = 7


class Extra:
    def __init__(self):
        self.b_from_Extra = 90


class Trash(Core, Extra):
    def __init__(self):
        super().__init__()

        print(self.a_from_Core)     # 正常输出7
        print(self.b_from_Extra)    # 正常输出90


trashcan = Trash()

Trash的MRO顺序是Trash -> Core -> Extra -> object,Core.__init__里的super()会自动调用Extra.__init__,完成两个父类的初始化。

方式二:在子类中显式调用每个父类的__init__

如果无法修改父类代码,可以直接在子类里手动触发每个父类的构造方法:

class Core:
    def __init__(self):
        self.a_from_Core = 7


class Extra:
    def __init__(self):
        self.b_from_Extra = 90


class Trash(Core, Extra):
    def __init__(self):
        Core.__init__(self)  # 显式调用Core的初始化
        Extra.__init__(self) # 显式调用Extra的初始化

        print(self.a_from_Core)     # 正常输出7
        print(self.b_from_Extra)    # 正常输出90


trashcan = Trash()

这种方式更直接,但如果继承关系复杂、父类数量多,后期维护成本会更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:50:25