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

Python多继承场景下使用super()调用__init__报参数不匹配错误如何解决

问题根因

Python 中 super() 调用遵循**方法解析顺序(MRO)**规则,你的HybridBorg类继承顺序声明为(Wizard, Archer),因此super().__init__默认会优先调用第一个父类Wizard的初始化方法:

  • Wizard.__init__ 仅接收 self、name、power 3个位置参数
  • 你调用super().__init__(name, power, arrows)时,总共传入了4个位置参数(含隐式的self),和方法定义的参数数量不匹配,因此抛出报错。

另外你的两个父类Wizard和Archer的初始化参数列表不一致,也没有做参数透传的兼容,直接用super()默认逻辑是无法同时完成两个父类的初始化的。

解决方案

方案1:保留显式父类构造调用(推荐,适配当前代码结构)

你的原有写法逻辑清晰,没有兼容负担,直接改回即可:

class HybridBorg(Wizard, Archer):
    def __init__(self, name, power, arrows):
        # 分别显式调用两个父类的初始化方法,参数对应匹配
        Wizard.__init__(self, name, power)
        Archer.__init__(self, name, arrows)

方案2:改造所有父类支持**kwargs透传,适配super调用逻辑

如果要统一用super()完成初始化,需要给所有父类的初始化方法增加多余参数的兼容逻辑:

class User():
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
    def sign_in(self):
        print("logged in")

class Wizard(User):
    def __init__(self, name, power, **kwargs):
        self.name1 = name
        self.power = power
        super().__init__(**kwargs)
    def attack(self):
        print(f"attacking with power of {self.power}")

class Archer(User):
    def __init__(self, name, arrows, **kwargs):
        self.name = name
        self.arrows = arrows
        super().__init__(**kwargs)
    def check_arrows(self):
        print(f"{self.arrows} remaining")
    def run(self):
        print ("ran really fast")

class HybridBorg(Wizard, Archer):
    def __init__(self, name, power, arrows):
        # 所有参数通过kwargs透传,父类各自提取自己需要的参数即可
        super().__init__(name=name, power=power, arrows=arrows)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:27:03