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

Python多继承为何仅能访问单父类属性?如何正确实现多继承?

Python多继承中super()无法访问多个父类属性的解决方法

你遇到的问题核心是Python的**MRO(方法解析顺序)**和super()的工作机制——super()并不是直接调用当前类的父类方法,而是按照MRO顺序调用序列中的下一个类的方法。如果你的父类没有正确配合super()使用,就会导致只有部分父类的初始化逻辑被执行,未被执行的父类属性自然无法访问。

错误代码示例(你可能的写法)

class One:
    def __init__(self):
        self.one = "one"

class Two:
    def __init__(self):
        self.two = "two"

class Three(One, Two):
    def __init__(self):
        super().__init__()

此时创建Three实例后,obj.one能正常访问,但obj.two会抛出AttributeError——因为super().__init__()只调用了One的__init__,而One的__init__没有继续调用Two的__init__,导致two属性从未被初始化。

正确实现方式

方式1:所有父类遵循MRO规则使用super()

让每个父类的__init__都通过super()调用MRO序列中的下一个类方法,这样整个继承链的初始化逻辑会被依次执行:

class One:
    def __init__(self):
        super().__init__()  # 关键:触发MRO下一个类的初始化
        self.one = "one"

class Two:
    def __init__(self):
        self.two = "two"

class Three(One, Two):
    def __init__(self):
        super().__init__()

# 测试验证
obj = Three()
print(obj.one)  # 输出: one
print(obj.two)  # 输出: two

你可以通过print(Three.__mro__)查看MRO顺序:(<class '__main__.Three'>, <class '__main__.One'>, <class '__main__.Two'>, <class 'object'>),One的super().__init__()会直接调用Two的__init__,从而完成two属性的初始化。

方式2:显式调用每个父类的__init__

如果父类代码无法修改,或者不想依赖MRO顺序,直接显式调用每个父类的初始化方法也是可行的:

class One:
    def __init__(self):
        self.one = "one"

class Two:
    def __init__(self):
        self.two = "two"

class Three(One, Two):
    def __init__(self):
        One.__init__(self)  # 直接调用One的初始化逻辑
        Two.__init__(self)  # 直接调用Two的初始化逻辑

# 测试验证
obj = Three()
print(obj.one)  # 输出: one
print(obj.two)  # 输出: two

注意:这种方式如果父类之间存在重复的初始化逻辑(比如都修改了同一个属性),需要自行处理冲突问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:50:26