多重继承,TypeError:__init__()接受2个位置参数,但给定了3个



我正在学习类的多重继承

class A(): 
def __init__(self, a): 
super().__init__() 
self.a = a                                                                                                                                             
class B(): 
def __init__(self, b): 
super().__init__() 
self.b = b 

class C(A, B): 
def __init__(self, a, b, c): 
super().__init__(a, b) 
self.c = c 

C(1, 2, 3)导致错误TypeError: __init__() takes 2 positional arguments but 3 were given

我希望它能按照A->B->C、 在查找存在的相关问题后,我仍然陷入困境

  • https://stackoverflow.com/a/39415209/7583919
  • https://stackoverflow.com/a/33469090/7583919

如果您需要为特定的超类提供特定的参数,您需要显式地这样做:

class A(): 
def __init__(self, a): 
self.a = a                                                                                                                                             
class B(): 
def __init__(self, b): 
self.b = b 

class C(A, B): 
def __init__(self, a, b, c): 
A.__init__(self, a) 
B.__init__(self, b)
self.c = c

注意,您也不能再在类AB中执行super().__init__(),因为super实际上并没有调用类的超类,它是";写入";,但是下一个类在方法解析顺序上。

通常,这样的代码表示设计不好/子类化的滥用。


或者,您可以通过使用关键字参数来绕过此问题:

class A(): 
def __init__(self, *, a, **kwargs):
super().__init__(**kwargs)
self.a = a
class B(): 
def __init__(self, *, b, **kwargs): 
super().__init__(**kwargs)
self.b = b 
class C(A, B): 
def __init__(self, a, b, c): 
super().__init__(a=a, b=b)
self.c = c

让基类将额外的*args传递给超级调用,从而使基类更加灵活

class A(): 
def __init__(self, a, *args): 
super().__init__(*args) 
self.a = a

class B(): 
def __init__(self, b, *args): 
super().__init__(*args) 
self.b = b 

class C(A, B): 
def __init__(self, a, b, c): 
super().__init__(a, b) 
self.c = c 
>>> c = C(1,2,3)
>>> c.a
1
>>> c.b
2
>>> c.c
3

为了不依赖mro:,最好使用关键字参数

class A(): 
def __init__(self, a=None, **kwargs): 
super().__init__(**kwargs) 
self.a = a

class B(): 
def __init__(self, b=None, **kwargs): 
super().__init__(**kwargs) 
self.b = b

class C(A, B): 
def __init__(self, a, b, c): 
super().__init__(a=a, b=b) 
self.c = c 

现在,class C(B, A)将按预期工作。

最新更新