91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中的super函數怎么用

發布時間:2022-10-12 15:04:04 來源:億速云 閱讀:104 作者:iii 欄目:web開發

這篇文章主要介紹了Python中的super函數怎么用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Python中的super函數怎么用文章都會有所收獲,下面我們一起來看看吧。

實戰場景

經常有朋友問,學 Python 面向對象時,翻閱別人代碼,會發現一個 super() 函數,那這個函數的作用到底是什么?

super() 函數的用途如下,在子類中調用父類的方法,多用于類的繼承關系。

其語法格式如下所示:

super(type[, object-or-type])

參數說明如下:

  • type:類,可選參數

  • object-or-type:對象或類,一般為 self,也是可選參數。

返回值是代理對象。

可以直接查詢官方幫助手冊:

help(super)

輸出信息如下所示:

Help on class super in module builtins:
class super(object)
 |  super() -> same as super(__class__, <first argument>)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)
 |  Typical use to call a cooperative superclass method:
 |  class C(B):
 |      def meth(self, arg):
 |          super().meth(arg)
 |  This works for class methods too:
 |  class C(B):
 |      @classmethod
 |      def cmeth(cls, arg):
 |          super().cmeth(arg)

對輸出結果進行分析之后,可以得到如下結論:

  • super 類是一個繼承自 object 的類,super() 函數就是對該類的實例化;

  • 調用 super() 實例化之后,返回一個 super 對象;

  • super() 參數有四種搭配,具體看上述輸出;

實戰編碼

單繼承使用

直接看一下單繼承相關代碼,其中使用類名去調用父類方法。

class A:
 def funA(self):
 print("執行 A ,輸出橡皮擦")
class B(A):
 def funB(self):
 # self 表示 B 類的實例
 A.funA(self)
 print("執行 B ,輸出鉛筆")
b = B()
b.funB()

上述代碼在 B 類中增加了 funB 函數,并且去調用 A 類中的 funA 函數,此時輸出的內容如下所示:

執行 A ,輸出橡皮擦
執行 B ,輸出鉛筆

如果將上述代碼修改為 super() 函數調用父類方法,可以使用下述代碼:

class A:
 def funA(self):
 print("執行 A ,輸出橡皮擦")
class B(A):
 def funB(self):
 # 注意 super() 函數的用法
 super().funA()
 print("執行 B ,輸出鉛筆")
b = B()
b.funB()

上述代碼與之前的運行結果一致,在單繼承的層級結構中,super 可以直接引用父類,即在子類中不需要使用父類名調用父類方法,而使用 代理對象(super 對象) 去調用,這樣的好處就是當父類名改變或繼承關系發生改變時,我們不需要對調用進行反復修改。

接下來看一下多繼承情況下,super() 函數的實戰場景。

class A:
 def run(self):
 print('AAA')
class B:
 def run(self):
 print('BBB')
class C:
 def run(self):
 print('CCC')
class D(A, B, C):
 def run(self):
 super().run()
d = D()
d.run()

此時輸出的結果是 AAA,可以看到 super 匹配到的數據是 A 類中的 run 函數,也就是最左側類中的方法,下面修改一下各類中 run 函數的名稱,使其存在差異。

class A:
 def run1(self):
 print('AAA')
class B:
 def run2(self):
 print('BBB')
class C:
 def run3(self):
 print('CCC')
class D(A, B, C):
 def run(self):
 # 調用 B 中 run2
 super().run2()
d = D()
d.run()

當一個類繼承多個類時,如果第一個父類中沒有提供該方法,當前類實例就會通過 __mro__ 屬性進行向上搜索,如果到 object 類都沒有檢索到該方法,就會引發 AttributeError 異常。

基于上述邏輯,我們可以擴展一下,使用 super() 函數中的參數。

class A:
 def run(self):
 print('AAA')
class B:
 def run(self):
 print('BBB')
class C:
 def run(self):
 print('CCC')
class D(A, B, C):
 def run(self):
 # 調用 C 中 run
 super(B, self).run()
d = D()
d.run()

此時輸出的結果是 CCC,該結果輸出表示了使用 super 函數之后,可以使用 super(類,self) 指定以哪個類為起點檢索父類中的方法,上述代碼設置的 B,就表示從 B 開始檢索,后續找到了 C 類,其中包含 run() 方法,所以輸出 CCC。

__mro__ 屬性的說明。

MRO 是 method resolution order,即方法解析順序,其本質是繼承父類方法時的順序表。
在 Python 中可以使用內置屬性 __mro__ 查看方法的搜索順序,例如下述代碼,重點查看輸出部分內容。

class A:
 def run(self):
 print('AAA')
class B:
 def run(self):
 print('BBB')
class C:
 def run(self):
 print('CCC')
class D(A, B, C):
 def run(self):
 # 調用 C 中 run
 super(B, self).run()
print(D.__mro__)

輸出的結果如下所示:

(<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)

你可以修改一下繼承順序,然后得到不同的輸出結果。

(<class '__main__.D'>, <class '__main__.A'>, <class '__main__.C'>, <class '__main__.B'>, <class 'object'>)

在搜索方法的時候,是按照 __mro__ 的輸出結果從左到右進行順序查找的,邏輯如下:

A. 找到方法,停止檢索;
B. 沒有找到,繼續檢索下一類;
C. 如果到最后都沒有找到,程序報錯。

關于“Python中的super函數怎么用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Python中的super函數怎么用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沂南县| 麻栗坡县| 玉树县| 肥西县| 安阳县| 荥经县| 涪陵区| 灯塔市| 枣强县| 岳阳市| 尚志市| 墨竹工卡县| 定安县| 涡阳县| 镇雄县| 虎林市| 赤水市| 吉木萨尔县| 莆田市| 汉寿县| 津市市| 常宁市| 崇信县| 尉犁县| 石景山区| 巴彦淖尔市| 普宁市| 梁平县| 谷城县| 遵义县| 蓬莱市| 新巴尔虎左旗| 曲阜市| 惠安县| 东光县| 温宿县| 望谟县| 鹤峰县| 平山县| 彭州市| 石台县|