Python中多继承的父类参数传递问题
问题原因
你当前的代码报错是因为:
- 父类A的
__init__需要2个位置参数(a、b),父类B的__init__需要3个位置参数(c、d、e) - 当调用
AB(1,2,3)时,*args会把这3个参数同时传给A和B的__init__:- 传给A时,A的
__init__收到self,1,2,3,超出了它需要的参数数量,直接抛出TypeError - 就算参数数量够,也会出现参数混淆的问题(比如把本该给B的参数传给A)
- 传给A时,A的
解决方法
方法1:明确传递对应参数(最直观)
直接在AB的__init__中定义所有需要的参数,分别传给两个父类:
class A: def __init__(self,a,b): self.a = a self.b = b def testa(self): print('inside A') class B: def __init__(self,c,d,e): self.c = c self.d = d self.e = e def testb(self): print('inside B') class AB(A,B): def __init__(self, a, b, c, d, e): # 传给A需要的a、b A.__init__(self, a, b) # 传给B需要的c、d、e B.__init__(self, c, d, e) # 创建实例时按顺序传入所有参数 obj = AB(1, 2, 3, 4, 5) print(obj.a, obj.b, obj.c, obj.d, obj.e) # 输出:1 2 3 4 5 obj.testa() # 输出:inside A obj.testb() # 输出:inside B
方法2:使用关键字参数(避免顺序混淆)
如果参数较多,用关键字参数更清晰,不容易搞混顺序:
class AB(A,B): def __init__(self, **kwargs): # 从kwargs中提取A需要的参数 a = kwargs.pop('a') b = kwargs.pop('b') A.__init__(self, a, b) # 剩下的kwargs传给B B.__init__(self, **kwargs) # 创建实例时用关键字指定参数 obj = AB(a=1, b=2, c=3, d=4, e=5)
方法3:利用super()实现多继承链(适合复杂场景)
如果后续有更多继承层级,可以修改父类的__init__来支持super调用链,这样AB只需调用一次super:
class A: def __init__(self,a,b,**kwargs): super().__init__(**kwargs) # 调用MRO链中的下一个类的__init__ self.a = a self.b = b def testa(self): print('inside A') class B: def __init__(self,c,d,e,**kwargs): super().__init__(**kwargs) self.c = c self.d = d self.e = e def testb(self): print('inside B') class AB(A,B): def __init__(self,a,b,c,d,e): super().__init__(a=a,b=b,c=c,d=d,e=e) obj = AB(1,2,3,4,5)
内容的提问来源于stack exchange,提问作者Shashank Tripathi
相关产品推荐
相关产品推荐

