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

Python多继承场景下如何正确初始化不同参数的父类?

多继承下不同父类的初始化解决方案

问题原因

在Python多继承中,super()是按照类的MRO(方法解析顺序)查找父类方法的。你的class C的MRO为[C, A, B, object],第二次调用super().__init__(b=b, d=d)时,依然会从MRO的当前位置找到A的__init__方法,而A的__init__仅接受a参数,因此触发参数错误。

解决方案

方案1:直接调用父类构造方法

不依赖super(),显式指定每个父类的__init__并传入对应参数:

class A:
    def __init__(self, a):
        print(f"A is init param={a}")

class B:
    def __init__(self, b, d):
        print(f"B is init param={b} {d}")

class C(A, B):
    def __init__(self, a, b, d):
        A.__init__(self, a)
        B.__init__(self, b, d)

c = C(a=3, b=5, d=9)

运行后输出:

A is init param=3
B is init param=5 9

这种方式简单直接,适合继承关系不复杂的场景。

方案2:遵循MRO链式调用规范

修改父类的__init__方法,让它们接收额外关键字参数并传递给下一个父类,通过一次super()调用完成所有初始化:

class A:
    def __init__(self, a, **kwargs):
        print(f"A is init param={a}")
        super().__init__(**kwargs)

class B:
    def __init__(self, b, d, **kwargs):
        print(f"B is init param={b} {d}")
        super().__init__(**kwargs)

class C(A, B):
    def __init__(self, a, b, d):
        super().__init__(a=a, b=b, d=d)

c = C(a=3, b=5, d=9)

运行结果与方案1一致。这种方式符合Python多继承设计规范,后续扩展子类时能保证初始化链的完整性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:31:14