Python中物件方法的定義很怪異,第一個參數一般都命名為self(相當於其它語言的this),用於傳遞物件本身,而在呼叫的時候則不必明確傳遞,系統會自動傳遞。
今天我們介紹的主角是super(), 在類別的繼承裡面super()非常常用, 它解決了子類別呼叫父類別方法的一些問題, 父類別多次被呼叫時只執行一次, 優化了執行邏輯,下面我們就來詳細看一下。
舉一個例子:
class Foo: def bar(self, message): print(message)
>>> Foo().bar("Hello, Python.") Hello, Python.
當存在繼承關係的時候,有時候需要簡單的方法中轉換父嗎成類調用,要注意的是這時self參數需要明確傳遞,例如:
class FooParent: def bar(self, message): print(message) class FooChild(FooParent): def bar(self, message): FooParent.bar(self, message)
>>> FooChild().bar("Hello, Python.") Hello, Python.
class FooParent: def bar(self, message): print(message) class FooChild(FooParent): def bar(self, message): super(FooChild, self).bar(message)
>>> FooChild().bar("Hello, Python.") Hello, Python.bar(self, message)方法的結果是一致的,實際上這兩種方法的內部處理機制大大不同,當涉及多繼承情況時,就會表現出明顯的差異來,直接給例子:
class A: def __init__(self): print("Enter A") print("Leave A") class B(A): def __init__(self): print("Enter B") A.__init__(self) print("Leave B") class C(A): def __init__(self): print("Enter C") A.__init__(self) print("Leave C") class D(A): def __init__(self): print("Enter D") A.__init__(self) print("Leave D") class E(B, C, D): def __init__(self): print("Enter E") B.__init__(self) C.__init__(self) D.__init__(self) print("Leave E") E()
Enter C
Enter A
Leave A
Leave C
Enter D
Enter A
Leave A
Leave D
Leave E
。代碼二:
class A: def __init__(self): print("Enter A") print("Leave A") class B(A): def __init__(self): print("Enter B") super(B, self).__init__() print("Leave B") class C(A): def __init__(self): print("Enter C") super(C, self).__init__() print("Leave C") class D(A): def __init__(self): print("Enter D") super(D, self).__init__() print("Leave D") class E(B, C, D): def __init__(self): print("Enter E") super(E, self).__init__() print("Leave E") E()
Leave C
Leave B
Leave E
在 Resuper機制裡可以保證公共父類僅被執行一次,至於執行的順序,是按照MRO(Method Resuper機制裡可以確保公共父類僅被執行一次,至於執行的順序,是按照MRO(Method Resuper機制裡可以確保公共父類別僅執行一次,至於執行的順序,是按照MRO(Method Resuper機制裡可以確保公共父類別僅執行一次,至於執行的順序,是按照MRO(Method Resuper機制裡可以確保公共父類僅執行一次,至於執行的順序,是按照MRO(Method Resuper機制裡可以確保公共父類別僅執行一次,至於執行的順序,是按照MRO(Method Resuper機制裡可以確保公共父類別僅執行一次,至於執行的順序,是按照MRO(Method Resuper機制裡可以確保公共父類別僅執行一次,至於執行的順序,是按照MRO(Method Resuper機制裡):方法解析到執行的順序的。後續會詳細介紹一下這個MRO機制。