所屬網站分類: python高級 > 面向對象 作者:阿裡媽媽 鏈接:http://www.pythonheidong.com/blog/article/74/ 來源:python黑洞網 有什麼區別? class Child(SomeBaseClass): def __init__(self): s ...
所屬網站分類: python高級 > 面向對象
作者:阿裡媽媽
鏈接:http://www.pythonheidong.com/blog/article/74/
來源:python黑洞網
有什麼區別?
class Child(SomeBaseClass): def __init__(self): super(Child, self).__init__()和
class Child(SomeBaseClass): def __init__(self): SomeBaseClass.__init__(self)我們已經看到super在只有單繼承的類中使用了很多,但也可以在多重繼承中使用它,那麼在這種情況下使用它的優點是什麼?
SomeBaseClass.__init__(self)意味著調用SomeBaseClass的__init__。而
super(Child, self).__init__()
表示__init__從Child實例的方法解析順序(MRO)中的父類調用綁定。
如果實例是Child的子類,則MRO中可能會有另一個父級。
我玩了一下super(),並且認識到我們可以改變呼叫順序。
例如,我們有下一個層次結構:
A / \ B C \ / D
在這種情況下,D的mro將是(僅適用於Python 3):
In [26]: D.__mro__ Out[26]: (__main__.D, __main__.B, __main__.C, __main__.A, object)讓我們創建一個super()執行後調用的類。
In [23]: class A(object): # or with Python 3 can define class A: ...: def __init__(self): ...: print("I'm from A") ...: ...: class B(A): ...: def __init__(self): ...: print("I'm from B") ...: super().__init__() ...: ...: class C(A): ...: def __init__(self): ...: print("I'm from C") ...: super().__init__() ...: ...: class D(B, C): ...: def __init__(self): ...: print("I'm from D") ...: super().__init__() ...: d = D() ...: I'm from D I'm from B I'm from C I'm from A A / ⇖ B ⇒ C ⇖ / D因此我們可以看到解決方案順序與MRO中的相同。但是當我們super()在方法的開頭調用時:
In [21]: class A(object): # or class A: ...: def __init__(self): ...: print("I'm from A") ...: ...: class B(A): ...: def __init__(self): ...: super().__init__() # or super(B, self).__init_() ...: print("I'm from B") ...: ...: class C(A): ...: def __init__(self): ...: super().__init__() ...: print("I'm from C") ...: ...: class D(B, C): ...: def __init__(self): ...: super().__init__() ...: print("I'm from D") ...: d = D() ...: I'm from A I'm from C I'm from B I'm from D我們有一個不同的順序,它顛倒了MRO元組的順序。
A / ⇘ B ⇐ C ⇘ / D