我正在学习类的多重继承
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
注意,您也不能再在类A
和B
中执行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)
将按预期工作。