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

如何用super()实现Python多继承类调用所有父类带参__init__方法

多继承下用super()调用多个父类的__init__方法

要让super()在多继承场景下正确触发所有父类的初始化方法,核心是让每个基类的__init__都参与到MRO(方法解析顺序)的调用链中——也就是每个基类处理完自己的参数后,要通过super()把剩余参数传递给下一个父类。

问题根源

你之前的代码只调用了一次super().__init__,但Base1的__init__没有继续调用super(),导致MRO链走到Base1就中断了,根本不会触发Base2的初始化逻辑。

解决方法:修改基类的__init__

调整两个基类,让它们在处理完自身参数后,通过super()传递剩余的关键字参数:

class Base1:
    def __init__(self, base_1: int, **kwargs):
        print(f"Base 1 initialized with base_1={base_1} and **kwargs={kwargs}")
        self._base_1: int = base_1
        # 传递剩余参数给MRO链的下一个类
        super().__init__(**kwargs)

class Base2:
    def __init__(self, base_2: int, **kwargs):
        print(f"Base 2 initialized with base_2={base_2} and **kwargs={kwargs}")
        self._base_2: int = base_2
        # 传递剩余参数(最终会到object,它的__init__不需要参数,空kwargs不影响)
        super().__init__(**kwargs)

然后子类只需要调用一次super(),把所有参数传进去即可:

class Child(Base1, Base2):
    def __init__(self, base_1: int, base_2: int):
        super().__init__(base_1=base_1, base_2=base_2)

测试执行child = Child(base_1=1, base_2=2),会输出:

Base 1 initialized with base_1=1 and **kwargs={'base_2': 2}
Base 2 initialized with base_2=2 and **kwargs={}

如果无法修改基类怎么办?

如果这两个基类是第三方库的代码,你没法修改它们的__init__,那直接显式调用Base1.__init__(self, ...)和Base2.__init__(self, ...)就是最稳妥的方案——这种写法虽然看起来不那么"Pythonic",但在多继承且基类不配合MRO链的场景下,是完全合理的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:15:16