日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

详解python的super()的作用和原理

發(fā)布時間:2024/5/7 python 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解python的super()的作用和原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。