对于单继承,super()只是引用基类型的一种更奇特的方法。这样,您可以使代码更易于维护,例如,如果您想更改基类型的名称。当您在任何地方使用super时,只需在class行中更改它。
不过,真正的好处在于多重继承。使用super时,一次调用不仅会自动调用all基类型的方法(按照正确的继承顺序),而且还将确保每个方法只调用一次。
这本质上允许类型具有diamond属性,例如,您有一个单一的基类型A,以及两个都派生自A的类型B和C。然后有一个类型D,它同时继承了B和C(使它隐式地继承了A两次)。如果现在显式地调用基类型的方法,则最终将调用A的方法两次。但是使用super,它只调用一次:class A (object):
def __init__ (self):
super().__init__()
print('A')
class B (A):
def __init__ (self):
super().__init__()
print('B')
class C (A):
def __init__ (self):
super().__init__()
print('C')
class D (C, B):
def __init__ (self):
super().__init__()
print('D')
当我们现在实例化D时,会得到以下输出:>>> D()
A
B
C
D
现在,让我们再次手动调用基类型的方法:class A2 (object):
def __init__ (self):
print('A2')
class B2 (A2):
def __init__ (self):
A2.__init__(self)
print('B2')
class C2 (A2):
def __init__ (self):
A2.__init__(self)
print('C2')
class D2 (C2, B2):
def __init__ (self):
B2.__init__(self)
C2.__init__(self)
print('D2')
这是输出:>>> D2()
A2
B2
A2
C2
D2
如您所见,A2发生两次。这通常不是你想要的。当您手动调用使用super的某个基类型的方法时,它变得更加混乱。因此,您应该只使用super()来确保一切正常,并且也不必太担心它。