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

Python双父类继承:如何简洁规范地实现?

双父类继承的规范实现方案

你的原代码报错核心原因是super的用法不符合Python MRO(方法解析顺序)规则:FullName的MRO顺序是[FullName, AddsFunct, AddsFunct2, object],当你写super(AddsFunct, self).__init__()时,super会跳过AddsFunct,直接调用MRO链中的下一个类AddsFunct2的__init__;而super(AddsFunct2, self).__init__()会调用object的__init__,完全没触发AddsFunct的初始化,导致self.greet1不存在,最终引发报错。

下面是两种简洁规范的实现方式:

方式一:父类遵循MRO协作(推荐复杂继承场景)

让每个父类的__init__都调用super(),这样子类只需一次super()调用,就能按MRO顺序自动初始化所有父类:

class AddsFunct:
    def __init__(self):
        self.greet1 = "hello"
        super().__init__()  # 触发MRO链下一个类的初始化

class AddsFunct2:
    def __init__(self):
        self.greet2 = "world"
        super().__init__()  # 最终调用object的__init__,无实际操作但符合规范

class FullName(AddsFunct, AddsFunct2):
    def __init__(self, name, surname):
        super().__init__()  # 按MRO依次调用AddsFunct、AddsFunct2的__init__
        self.name = name
        self.surname = surname

    def printer(self):
        print(f"{self.greet1} {self.name} {self.surname} {self.greet2}")

fullname = FullName("John", "Doe")
fullname.printer()  # 输出:hello John Doe world

这种方式的优势是后续调整继承顺序、新增父类时,无需修改子类的初始化逻辑,符合Python多继承的设计规范。

方式二:显式调用父类__init__(适合简单独立父类场景)

如果父类逻辑完全独立,直接显式调用每个父类的__init__方法,逻辑更直观:

class AddsFunct:
    def __init__(self):
        self.greet1 = "hello"

class AddsFunct2:
    def __init__(self):
        self.greet2 = "world"

class FullName(AddsFunct, AddsFunct2):
    def __init__(self, name, surname):
        AddsFunct.__init__(self)  # 直接调用AddsFunct的初始化
        AddsFunct2.__init__(self) # 直接调用AddsFunct2的初始化
        self.name = name
        self.surname = surname

    def printer(self):
        print(f"{self.greet1} {self.name} {self.surname} {self.greet2}")

fullname = FullName("John", "Doe")
fullname.printer()  # 输出:hello John Doe world

这种写法无需依赖MRO规则,适合父类之间没有协作、继承结构不会频繁变动的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:25:04