最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解Python中的super?函數(shù)

 更新時(shí)間:2022年09月06日 10:07:42   作者:華為云開發(fā)者聯(lián)盟???????  
這篇文章主要介紹了一文了解Python中的super?函數(shù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下

實(shí)戰(zhàn)場景

經(jīng)常有朋友問,學(xué) Python 面向?qū)ο髸r(shí),翻閱別人代碼,會發(fā)現(xiàn)一個(gè) super() 函數(shù),那這個(gè)函數(shù)的作用到底是什么?

super() 函數(shù)的用途如下,在子類中調(diào)用父類的方法,多用于類的繼承關(guān)系。

其語法格式如下所示:

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

參數(shù)說明如下:

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

返回值是代理對象。

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

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)

對輸出結(jié)果進(jìn)行分析之后,可以得到如下結(jié)論:

  • super 類是一個(gè)繼承自 object 的類,super() 函數(shù)就是對該類的實(shí)例化;
  • 調(diào)用 super() 實(shí)例化之后,返回一個(gè) super 對象;
  • super() 參數(shù)有四種搭配,具體看上述輸出;

實(shí)戰(zhàn)編碼

單繼承使用

直接看一下單繼承相關(guān)代碼,其中使用類名去調(diào)用父類方法。

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

上述代碼在 B 類中增加了 funB 函數(shù),并且去調(diào)用 A 類中的 funA 函數(shù),此時(shí)輸出的內(nèi)容如下所示:

執(zhí)行 A ,輸出橡皮擦
執(zhí)行 B ,輸出鉛筆

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

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

上述代碼與之前的運(yùn)行結(jié)果一致,在單繼承的層級結(jié)構(gòu)中,super 可以直接引用父類,即在子類中不需要使用父類名調(diào)用父類方法,而使用 代理對象(super 對象) 去調(diào)用,這樣的好處就是當(dāng)父類名改變或繼承關(guān)系發(fā)生改變時(shí),我們不需要對調(diào)用進(jìn)行反復(fù)修改。

接下來看一下多繼承情況下,super() 函數(shù)的實(shí)戰(zhàn)場景。

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()

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

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):
# 調(diào)用 B 中 run2
super().run2()
d = D()
d.run()

當(dāng)一個(gè)類繼承多個(gè)類時(shí),如果第一個(gè)父類中沒有提供該方法,當(dāng)前類實(shí)例就會通過 __mro__ 屬性進(jìn)行向上搜索,如果到 object 類都沒有檢索到該方法,就會引發(fā) AttributeError 異常。

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

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):
# 調(diào)用 C 中 run
super(B, self).run()
d = D()
d.run()

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

__mro__ 屬性的說明。

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

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):
# 調(diào)用 C 中 run
super(B, self).run()
print(D.__mro__)

輸出的結(jié)果如下所示:

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

你可以修改一下繼承順序,然后得到不同的輸出結(jié)果:

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

在搜索方法的時(shí)候,是按照 __mro__ 的輸出結(jié)果從左到右進(jìn)行順序查找的,邏輯如下:

  • A. 找到方法,停止檢索;
  • B. 沒有找到,繼續(xù)檢索下一類;
  • C. 如果到最后都沒有找到,程序報(bào)錯(cuò)。

到此這篇關(guān)于一文了解Python中的super 函數(shù)的文章就介紹到這了,更多相關(guān)Python super 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python subprocess pipe 實(shí)時(shí)輸出日志的操作

    python subprocess pipe 實(shí)時(shí)輸出日志的操作

    這篇文章主要介紹了python subprocess pipe 實(shí)時(shí)輸出日志的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Python探索之修改Python搜索路徑

    Python探索之修改Python搜索路徑

    這篇文章主要介紹了Python探索之修改Python搜索路徑,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • python實(shí)現(xiàn)對指定輸入的字符串逆序輸出的6種方法

    python實(shí)現(xiàn)對指定輸入的字符串逆序輸出的6種方法

    這篇文章主要介紹了python實(shí)現(xiàn)對指定輸入的字符串逆序輸出的6種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 如何利用Python模擬GitHub登錄詳解

    如何利用Python模擬GitHub登錄詳解

    這篇文章主要給大家介紹了關(guān)于如何利用Python模擬GitHub登錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 利用PyQT5日期控件制作一個(gè)小日歷

    利用PyQT5日期控件制作一個(gè)小日歷

    這篇文章主要介紹了利用PyQT5的日期控件制作一個(gè)小日歷,因?yàn)閜yqt5已經(jīng)自帶了相關(guān)的日期控件,只需要明白如何調(diào)用再加上比較個(gè)性化的功能,這個(gè)日歷的小控件就制作完成了。需要的可以參考一下
    2022-01-01
  • pytorch簡單實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)功能

    pytorch簡單實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)功能

    這篇文章主要介紹了pytorch簡單實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • python requests post的使用方式

    python requests post的使用方式

    這篇文章主要介紹了python requests post的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 利用python微信庫itchat實(shí)現(xiàn)微信自動回復(fù)功能

    利用python微信庫itchat實(shí)現(xiàn)微信自動回復(fù)功能

    最近發(fā)現(xiàn)了一個(gè)特別好玩的Python 微信庫itchat,可以實(shí)現(xiàn)自動回復(fù)等多種功能,下面這篇文章主要給大家介紹了利用python微信庫itchat實(shí)現(xiàn)微信自動回復(fù)功能的相關(guān)資料,需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。
    2017-05-05
  • python利用beautifulSoup實(shí)現(xiàn)爬蟲

    python利用beautifulSoup實(shí)現(xiàn)爬蟲

    這篇文章主要介紹了python利用beautifulSoup實(shí)現(xiàn)爬蟲,需要的朋友可以參考下
    2014-09-09
  • 基于python實(shí)現(xiàn)鼠標(biāo)實(shí)時(shí)坐標(biāo)監(jiān)測

    基于python實(shí)現(xiàn)鼠標(biāo)實(shí)時(shí)坐標(biāo)監(jiān)測

    這篇文章主要給大家介紹了如何基于python實(shí)現(xiàn)鼠標(biāo)實(shí)時(shí)坐標(biāo)監(jiān)測,文章通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-11-11

最新評論

常德市| 武川县| 滦南县| 中阳县| 丰台区| 理塘县| 周宁县| 青神县| 安平县| 黎城县| 万安县| 普定县| 元阳县| 绥棱县| 徐汇区| 阜南县| 平定县| 潼关县| 赤城县| 红安县| 阜新| 黎城县| 前郭尔| 镇雄县| 遂溪县| 昌邑市| 新龙县| 万载县| 三门峡市| 灵宝市| 天门市| 明星| 宁津县| 石嘴山市| 榆树市| 洛川县| 大同市| 昌黎县| 社会| 沁水县| 洛南县|