详解python的super()的作用和原理
Python中對象方法的定義很怪異,第一個參數(shù)一般都命名為self(相當(dāng)于其它語言的this),用于傳遞對象本身,而在調(diào)用的時候則不必顯式傳遞,系統(tǒng)會自動傳遞。
今天我們介紹的主角是super(), 在類的繼承里面super()非常常用, 它解決了子類調(diào)用父類方法的一些問題, 父類多次被調(diào)用時只執(zhí)行一次, 優(yōu)化了執(zhí)行邏輯,下面我們就來詳細看一下。
舉一個例子:
class Foo:def bar(self, message):print(message) >>> Foo().bar("Hello, Python.") Hello, Python.當(dāng)存在繼承關(guān)系的時候,有時候需要在子類中調(diào)用父類的方法,此時最簡單的方法是把對象調(diào)用轉(zhuǎn)換成類調(diào)用,需要注意的是這時self參數(shù)需要顯式傳遞,例如:
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.這樣做有一些缺點,比如說如果修改了父類名稱,那么在子類中會涉及多處修改,另外,Python是允許多繼承的語言,如上所示的方法在多繼承時就需要重復(fù)寫多次,顯得累贅。為了解決這些問題,Python引入了super()機制,例子代碼如下:
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.表面上看 super(FooChild, self).bar(message)方法和FooParent.bar(self, message)方法的結(jié)果是一致的,實際上這兩種方法的內(nèi)部處理機制大大不同,當(dāng)涉及多繼承情況時,就會表現(xiàn)出明顯的差異來,直接給例子:
代碼一:
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()結(jié)果:
Enter E
Enter B
Enter A
Leave A
Leave B
Enter C
Enter A
Leave A
Leave C
Enter D
Enter A
Leave A
Leave D
Leave E
執(zhí)行順序很好理解,唯一需要注意的是公共父類A被執(zhí)行了多次。
代碼二:
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()結(jié)果:
Enter E
Enter B
Enter C
Enter D
Enter A
Leave A
Leave D
Leave C
Leave B
Leave E
在super機制里可以保證公共父類僅被執(zhí)行一次,至于執(zhí)行的順序,是按照MRO(Method Resolution Order):方法解析順序 進行的。后續(xù)會詳細介紹一下這個MRO機制。
總結(jié)
以上是生活随笔為你收集整理的详解python的super()的作用和原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: setdefaultencoding函数
- 下一篇: 深入分析python的and or 返回