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

Python多类继承初始化报错,如何正确使用super方法?

Python多继承中正确初始化子类的方法

错误原因

你当前的代码中,super().__init__()在多继承的方法解析顺序(MRO)里只会调用第一个父类A的构造方法,但你把所有6个参数都传递给了A,而A的__init__仅接受self+a/a1/a2共4个参数,因此触发参数数量不匹配的报错。

解决方案1:显式调用每个父类的构造方法

直接通过父类名调用各自的__init__方法,传入对应参数即可:

class A(object):
    def __init__(self, a=0, a1=0, a2=0):
        self.a = a
        self.a1 = a1
        self.a2 = a2

class B(object):
    def __init__(self, b=0, b1=0, b2=0):
        self.b = b
        self.b1 = b1
        self.b2 = b2

class C(A, B):
    def __init__(self, a, a1, a2, b, b1, b2):
        # 分别调用A和B的构造方法,传入各自所需参数
        A.__init__(self, a, a1, a2)
        B.__init__(self, b, b1, b2)

初始化C时:

c = C(a=1, a1=1, a2=1, b=2, b1=2, b2=2)

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

解决方案2:让父类兼容super链式调用

通过**kwargs接收未匹配的参数,并在每个父类的__init__中调用super().__init__(**kwargs),保证MRO链中所有父类都能被正确初始化:

class A(object):
    def __init__(self, a=0, a1=0, a2=0, **kwargs):
        self.a = a
        self.a1 = a1
        self.a2 = a2
        # 传递剩余参数给MRO链中的下一个类
        super().__init__(**kwargs)

class B(object):
    def __init__(self, b=0, b1=0, b2=0, **kwargs):
        self.b = b
        self.b1 = b1
        self.b2 = b2
        super().__init__(**kwargs)

class C(A, B):
    def __init__(self, a, a1, a2, b, b1, b2):
        super().__init__(a=a, a1=a1, a2=a2, b=b, b1=b1, b2=b2)

这种方式更符合Python多继承的设计理念,当继承链较长或存在多层继承时,能避免遗漏父类初始化或重复调用的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:20:06