对于单继承,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
<__main__.D object at 0x000000000371DD30>
现在,让我们再次手动调用基类型的方法:
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
<__main__.D2 object at 0x0000000003734E48>
如你所见,A2
出现两次.这通常不是你想要的.当您手动调用使用super
的一个基本类型的方法时,它会变得更加混乱.所以,你应该用super()
来确保一切正常,这样你就不用太担心了.