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
相关产品推荐
相关产品推荐

