对于单继承,
super()只是引用基本类型的一种更简单的方法。这样,您可以使代码更具可维护性,例如,如果您想更改基本类型的名称。当您在
super各处使用时,只需在
class生产线中进行更改即可。
真正的好处是多重继承。使用时
super,单个调用不仅会自动调用 所有 基本类型的方法(以正确的继承顺序),而且还会确保每个方法仅被调用一次。
本质上,这使类型具有菱形属性,例如,您有一个基本类型
A,又有两个类型
B,
C它们都从派生
A。然后,您有一个
D既继承自
Band的类型
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()ABCD<__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()A2B2A2C2D2<__main__.D2 object at 0x0000000003734E48>
如您所见,
A2发生两次。这通常不是您想要的。当您手动调用使用的一种基本类型的方法时,它甚至变得更加混乱
super。因此,相反,您应该只是
super()用来确保一切正常,并且也不必担心太多。



