这里有几个类,我们说,B, C, D和A,而在类A中,我使用的是具有类'B'作为参数的超级方法。
类的定义如下:
class B:
def __init__(self):
print('B')
class C:
def __init__(self):
print('C')
class D:
def __init__(self):
print('D')
class A(B,C,D):
def __init__(self):
super(B,self).__init__()
A()
当我试图初始化类A时,它应该在我通过super方法传递B时调用类B。但是它给我的输出是C。如果我在super中传递D而不是B,它没有任何输出。为什么?相反,它只是调用类A并离开。
为什么会发生这种情况?
作为参数传递给super
的类应该是当前的类,其超类我们希望查找,而不是目标超类。对于类A
,方法解析顺序为
A < B < C < D < object
因此super(A, self).__init__()
将调用MRO中A
之后的类的方法,即B
。同样,super(B, self).__init__()
将调用B
之后的C
。super(C, self)
会给我们D
,super(D, self)
会给我们object
(旁注:我不知道super(object, self)
做什么,但它似乎返回一个代理对象,只是吃所有的方法调用)。
你要找的是
super(A, self).__init__()
,但是由于您在一个方法中,并且无论如何都希望调用MRO链中的下一个方法(默认的,最合理的行为),因此您可以使用0参数形式。
super().__init__()