日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Python super( )函數(shù)用法總結(jié)

瀏覽:29日期:2022-06-17 08:28:09
目錄一、super( ) 的用途二、了解 super 的基礎(chǔ)信息三、典型用法3.1 單繼承問題3.2 單繼承問題拓展3.3 重復(fù)調(diào)用問題3.4 super(type) 問題一、super( ) 的用途

了解 super() 函數(shù)之前,我們首先要知道 super() 的用途是啥?

主要用來在子類中調(diào)用父類的方法。 多用于多繼承問題中,解決查找順序(MRO)、重復(fù)調(diào)用(鉆石繼承)等種種問題。二、了解 super 的基礎(chǔ)信息

語法格式:

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

函數(shù)描述:

返回一個(gè)代理對象,它會(huì)將方法調(diào)用委托給 type 的父類或兄弟類。

參數(shù)說明:

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

返回值:

super object —— 代理對象。

help 幫助信息:

>>> 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 是一個(gè)繼承自 object 的類,調(diào)用 super() 函數(shù)其實(shí)就是 super 類的實(shí)例化。 根據(jù)官方文檔的解釋 super() 函數(shù)返回的對象 —— super object,就是一個(gè)代理對象。 super() 有四種參數(shù)的組合形式。 super()適用于類的靜態(tài)方法。三、典型用法3.1 單繼承問題

首先我們看一個(gè)最基本的子類調(diào)用父類方法的示例:

>>> class A:def funxx(self): print('執(zhí)行 A 中的 funxx 方法 ... ...') >>> class B(A):def funxx(self): A.funxx(self) # 通過類名調(diào)用父類中的同名方法,self 參數(shù)代表 B 類的實(shí)例對象 b print('執(zhí)行 B 中的 funxx 方法 ... ...') >>> b = B()>>> b.funxx()執(zhí)行 A 中的 funxx 方法 ... ...執(zhí)行 B 中的 funxx 方法 ... ... 定義一個(gè)繼承自 A 類的子類 B,并在 B 類中重寫 funxx() 方法,B 中的 funxx() 是對 A 中的 funxx() 功能的拓展。 因?yàn)槭峭卣沽?A 類的 funxx() 方法的功能,所以其任然保留了原功能,即要在子類 B 中調(diào)用父類的同名方法來實(shí)現(xiàn)原有功能。 上面的示例中是通過 A 類類名調(diào)用 A 類中的同名方法來實(shí)現(xiàn)的,而第一個(gè)參數(shù) self 實(shí)際傳遞的是 B 類的實(shí)例 b。

使用 super() 函數(shù)來實(shí)現(xiàn)父類方法的調(diào)用:

>>> class A:def funxx(self): print('執(zhí)行 A 中的 funxx 方法 ... ...') >>> class B(A):def funxx(self): super().funxx() print('執(zhí)行 B 中的 funxx 方法 ... ...') >>> b = B()>>> b.funxx()執(zhí)行 A 中的 funxx 方法 ... ...執(zhí)行 B 中的 funxx 方法 ... ... 通過執(zhí)行的結(jié)果可以看出實(shí)現(xiàn)了和普通類名調(diào)用的結(jié)果是一樣的。 在具有單繼承的類層級結(jié)構(gòu)中,super 引用父類而不必顯式地指定它們的名稱,從而令代碼更易維護(hù)。(官方文檔描述) 也就是說,在子類中不再用父類名調(diào)用父類方法,而是用一個(gè)代理對象調(diào)用父類方法,這樣當(dāng)父類名改變或者繼承關(guān)系發(fā)生變化時(shí),不用對每個(gè)調(diào)用處都進(jìn)行修改。3.2 單繼承問題拓展

在 help() 的幫助信息中,也說明了類中使用 super() 不帶參數(shù)的形式等同于 super(__class__, <first argument>) 這種形式。這也是 Python 2.x 和 Python 3.x 關(guān)于 super() 的區(qū)別。

改寫之前的單繼承問題的代碼:

>>> class A:def funxx(self): print('執(zhí)行 A 中的 funxx 方法 ... ...') >>> class B(A):def funxx(self):super(B, self).funxx()print('執(zhí)行 B 中的 funxx 方法 ... ...') >>> b = B()>>> b.funxx()執(zhí)行 A 中的 funxx 方法 ... ...執(zhí)行 B 中的 funxx 方法 ... ... 基本的調(diào)用方法 A.funxx(self) ,其中 self 指代實(shí)例對象 b。用語言描述為:實(shí)例對象 b 通過 A 類名調(diào)用方法 funxx()。 官方描述:返回一個(gè)代理對象,它會(huì)將方法調(diào)用委托給 type 的父類或兄弟類。用語言描述為:代理對象 super 通過 type 的父類或兄弟類調(diào)用其中的方法。 我們發(fā)現(xiàn) super 是通過參數(shù)設(shè)置來選擇調(diào)用哪個(gè)父類的方法。其中第二個(gè)參數(shù)給出 MRO(方法解析順序),也就是搜索目標(biāo)方法的順序,第一個(gè)參數(shù)則給出搜索目標(biāo)方法的范圍。 例如 super(B, self) ,第一個(gè)參數(shù)為 B,第二個(gè)參數(shù) self 為實(shí)例 b,其所在類的繼承順序(MRO)為:B→A→object。所以調(diào)用時(shí)是在 B 的父類 A 中尋找,如找不到目標(biāo)方法則會(huì)在更上一層的 object 中尋找。

示例:

class A: pass class B(A): pass class C(A): def funxx(self):print('找到 funxx() 位于 C 中...') class D(A): pass class E(B, C): pass class F(E, D): def funff(self):print('執(zhí)行 F 中的 funff()...')super(E, self).funxx() print(f'F 類的 MRO : {F.__mro__}')f = F()f.funff()

運(yùn)行結(jié)果:

F 類的 MRO : (<class ’__main__.F’>, <class ’__main__.E’>, <class ’__main__.B’>, <class ’__main__.C’>, <class ’__main__.D’>, <class ’__main__.A’>, <class ’object’>)執(zhí)行 F 中的 funff()...找到 funxx() 位于 C 中... 我們可以看出 F 類的 MRO:F→E→B→C→D→A→object。 super() 函數(shù)的第一個(gè)參數(shù)為:E,目標(biāo)是調(diào)用 E 類的父類 B 中的 funxx() 方法,可惜 B 類中沒找到,在 B 類的兄弟類 C 中找到了,符合要求。3.3 重復(fù)調(diào)用問題

重復(fù)調(diào)用問題 也稱 鉆石繼承問題 或 菱形圖問題。

先來看看普通調(diào)用方法在:

>>> class A:def __init__(self): print('打印屬性 a') >>> class B(A):def __init__(self): print('打印屬性 b') A.__init__(self) >>> class C(A):def __init__(self): print('打印屬性 c') A.__init__(self) >>> class D(B, C):def __init__(self): print('打印屬性 d') B.__init__(self) C.__init__(self) >>> d = D()打印屬性 d打印屬性 b打印屬性 a打印屬性 c打印屬性 a 因?yàn)?B,C 都繼承自 A,所以當(dāng) D 在實(shí)例化時(shí),A 的構(gòu)造函數(shù)被執(zhí)行了兩次。這就是所謂的重復(fù)調(diào)用問題。 很顯然,我們只需要調(diào)用一次就可以了,重復(fù)的調(diào)用只會(huì)造成資源浪費(fèi)。

接下來我們使用 super() 函數(shù)來調(diào)用:

>>> class A:def __init__(self): print('打印屬性 a') >>> class B(A):def __init__(self): print('打印屬性 b') super().__init__()# super() 等同于 super(B, self) >>> class C(A):def __init__(self): print('打印屬性 c') super().__init__()# super() 等同于 super(C, self) >>> class D(B, C):def __init__(self): print('打印屬性 d') super(D, self).__init__() >>> d = D()打印屬性 d打印屬性 b打印屬性 c打印屬性 a 查看輸出結(jié)果我們發(fā)現(xiàn)雖然解決了重復(fù)調(diào)用問題,但是輸出結(jié)果的順序好像與我們想的有所區(qū)別。我們的慣性思維是:先執(zhí)行 D 類的 __init__() 方法,接著調(diào)用 B 類的 __init__() 方法,B 類的構(gòu)造方法中又調(diào)用了父類 A 的 __init_() 方法,然后再是調(diào)用 C 類的 __init_() 方法,該方法也調(diào)用了父類 A 的 __init__() 方法。所以執(zhí)行的結(jié)果應(yīng)該是:打印屬性 d,打印屬性 b,打印屬性 a,打印屬性 c。 為何結(jié)果不是我們想的那樣呢,首先我們要知道 D 類中的第二個(gè)參數(shù) self 為 D 的實(shí)例 d,它提供的 MRO 為:D→B→C→A→object。所以 D 類中的 super() 函數(shù)產(chǎn)生的是 d 的代理對象,當(dāng)其調(diào)用父類 B 的 __init__() 時(shí),B 的 super() 的第二個(gè)參數(shù)為 D 中的 super object,其所提供的 MRO 依舊為:D→B→C→A→object。也就是說 B 中的 super() 調(diào)用的是它的上一級 C 中的 __init__() ,而不是 A 中的 __init__()。所以執(zhí)行的結(jié)果是:打印屬性 d,打印屬性 b,打印屬性 c,打印屬性 a。3.4 super(type) 問題

>>> class A: def funxx(self): print('...A...') >>> class B(A): def funxx(self): print('...B...') >>> sa = super(B)>>> print(sa)<super: <class ’B’>, NULL>>>> print(type(sa))<class ’super’>

可以看出 super(type) 返回的是一個(gè)無效的對象,或者是未綁定的 super object。

到此這篇關(guān)于Python super( )函數(shù)用法總結(jié)的文章就介紹到這了,更多相關(guān)super( )函數(shù)內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
婷婷综合激情| 国产高清亚洲| 欧美中文一区二区| 日本精品不卡| 久久久久久久久久久妇女| 麻豆久久一区| 久久精品亚洲| 国产精品久久久久久久免费观看 | 欧美福利一区| 欧美手机在线| 99国产精品私拍| 中文视频一区| 欧美一级二区| 另类综合日韩欧美亚洲| 久久久久免费| 999视频精品| 在线 亚洲欧美在线综合一区| 老牛影视一区二区三区| 午夜视频一区二区在线观看| 国产色99精品9i| 老牛国内精品亚洲成av人片| 欧美好骚综合网| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产欧美日韩影院| 美女视频黄久久| 久久婷婷久久| 亚洲视频二区| 日韩在线麻豆| 国产激情久久| 99精品美女| 天堂久久av| 精品视频国内| 91成人网在线观看| 亚洲精品美女91| 国产精品xxx在线观看| 亚洲午夜天堂| 久久都是精品| 国产欧美激情| 久久久久.com| 亚洲天堂av资源在线观看| 日本不卡视频在线观看| 国产中文字幕一区二区三区| 日韩欧美一区二区三区在线观看| 性欧美69xoxoxoxo| 97久久精品| 欧美精品高清| 免费不卡在线观看| 国产精品多人| 九一国产精品| 日本欧美在线| 中文字幕色婷婷在线视频| 蜜桃tv一区二区三区| 亚洲精品无吗| 黑森林国产精品av| 一二三区精品| 国产成人精品三级高清久久91| 美女网站一区| 亚洲精品一级二级三级| 国产精品福利在线观看播放| 在线亚洲国产精品网站| 久久a爱视频| 午夜国产欧美理论在线播放| 国产精品亚洲综合久久| 婷婷亚洲综合| 久久亚洲道色| 日韩精品一二三区| 成人精品动漫一区二区三区| 蜜臀久久99精品久久久久久9 | 欧美日韩国产一区二区在线观看| 高清久久精品| 婷婷综合福利| 久久精品卡一| 里番精品3d一二三区| 国产亚洲亚洲| 国产精品精品国产一区二区| 亚洲1区在线观看| 久久亚洲国产| 国内精品亚洲| 久久精品xxxxx| 在线亚洲自拍| 国产精品久久观看| 国产精品欧美大片| 亚洲精品美女| 日韩精品dvd| 国产精品视频首页| 综合激情网...| 欧美精品激情| 日韩精品欧美| 韩日一区二区| 国产精品久久| 日本伊人久久| 美日韩精品视频| 国户精品久久久久久久久久久不卡 | 亚洲一区二区小说| 五月精品视频| av综合电影网站| 久久精品国产免费| 欧美视频二区| 日韩精品一区二区三区中文在线| 尹人成人综合网| 91精品一区二区三区综合| 精品九九在线| 免费亚洲一区| 麻豆国产欧美一区二区三区 | 欧美欧美黄在线二区| 在线精品国产亚洲| 亚洲欧美日韩在线观看a三区| 日韩电影免费网址| 日韩在线第七页| bbw在线视频| 精品一区二区男人吃奶| 麻豆成人91精品二区三区| 国产精品高清一区二区| 国产精品久久久亚洲一区| 欧美日韩一区二区国产| 欧美影院视频| 国产欧美大片| 国产精品一区二区精品视频观看 | 欧美日韩激情| 亚洲调教视频在线观看| 久久影院一区| 国产综合精品一区| 国产在线欧美| 夜夜嗨一区二区| 久久午夜精品| 亚洲精选成人| 日本va欧美va瓶| 国产日韩一区二区三区在线播放| 91成人福利| 国产精品久久| 成人亚洲一区| 久久婷婷久久| 午夜久久久久| 综合国产视频| 欧美日韩18| 精品黄色一级片| av综合电影网站| 蜜桃视频欧美| 午夜电影亚洲| 日韩一二三区在线观看| 国产精品一线| av中文字幕在线观看第一页| 激情六月综合| 免费久久精品视频| 国产欧美91| www.com.cn成人| 好吊视频一区二区三区四区| 国产亚洲精品v| 日本欧美久久久久免费播放网| 国产精品极品国产中出| 免费看av不卡| 午夜亚洲精品| 国产日韩欧美一区在线| 欧美www视频在线观看| 欧美在线亚洲| 欧美天堂一区| 欧美男人天堂| 视频一区二区三区中文字幕| 涩涩涩久久久成人精品| 国产suv精品一区| 欧美/亚洲一区| 日韩国产一二三区| 精品亚洲精品| 午夜欧美精品| 国产日韩在线观看视频| 欧美亚洲日本精品| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品毛片久久久| 99久久久国产精品美女| 亚洲毛片一区| 日韩欧美精品综合| 亚洲欧美视频| 久久97视频| 视频一区视频二区中文| 国产精品日本一区二区三区在线| 成人日韩在线观看| 亚洲欧洲日韩| 精品国产精品国产偷麻豆 | 国产精品99视频| 首页亚洲欧美制服丝腿| 精品一区av| 亚洲欧美网站在线观看| 色婷婷综合网| 美女精品在线| 极品av在线| 日本精品在线播放| 欧美一区二区三区高清视频| 国产精品视频首页| 性色一区二区| 国产在线不卡一区二区三区| 在线精品一区二区| 日韩伦理在线一区| 欧美中文一区| 国产综合激情| 精品一区二区三区中文字幕视频| 亚洲在线一区| 鲁鲁在线中文| 国产精品亚洲片在线播放| 国产精品毛片一区二区三区| 精品三级av在线导航|