多重继承如何与super一起工作?



这里有几个类,我们说,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之后的Csuper(C, self)会给我们D,super(D, self)会给我们object(旁注:我不知道super(object, self)做什么,但它似乎返回一个代理对象,只是吃所有的方法调用)。

你要找的是

super(A, self).__init__()

,但是由于您在一个方法中,并且无论如何都希望调用MRO链中的下一个方法(默认的,最合理的行为),因此您可以使用0参数形式。

super().__init__()