Python多继承场景下使用super()调用__init__报参数不匹配错误如何解决
问题根因
Python 中 super() 调用遵循**方法解析顺序(MRO)**规则,你的HybridBorg类继承顺序声明为(Wizard, Archer),因此super().__init__默认会优先调用第一个父类Wizard的初始化方法:
Wizard.__init__仅接收self、name、power3个位置参数- 你调用
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
相关产品推荐
相关产品推荐

