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
相关产品推荐
相关产品推荐

