成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Python super( )函數用法總結

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

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

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

語法格式:

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

函數描述:

返回一個代理對象,它會將方法調用委托給 type 的父類或兄弟類。

參數說明:

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

返回值:

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

首先我們看一個最基本的子類調用父類方法的示例:

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

使用 super() 函數來實現父類方法的調用:

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

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

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

>>> class A:def funxx(self): print('執行 A 中的 funxx 方法 ... ...') >>> class B(A):def funxx(self):super(B, self).funxx()print('執行 B 中的 funxx 方法 ... ...') >>> b = B()>>> b.funxx()執行 A 中的 funxx 方法 ... ...執行 B 中的 funxx 方法 ... ... 基本的調用方法 A.funxx(self) ,其中 self 指代實例對象 b。用語言描述為:實例對象 b 通過 A 類名調用方法 funxx()。 官方描述:返回一個代理對象,它會將方法調用委托給 type 的父類或兄弟類。用語言描述為:代理對象 super 通過 type 的父類或兄弟類調用其中的方法。 我們發現 super 是通過參數設置來選擇調用哪個父類的方法。其中第二個參數給出 MRO(方法解析順序),也就是搜索目標方法的順序,第一個參數則給出搜索目標方法的范圍。 例如 super(B, self) ,第一個參數為 B,第二個參數 self 為實例 b,其所在類的繼承順序(MRO)為:B→A→object。所以調用時是在 B 的父類 A 中尋找,如找不到目標方法則會在更上一層的 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('執行 F 中的 funff()...')super(E, self).funxx() print(f'F 類的 MRO : {F.__mro__}')f = F()f.funff()

運行結果:

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

重復調用問題 也稱 鉆石繼承問題 或 菱形圖問題。

先來看看普通調用方法在:

>>> 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 因為 B,C 都繼承自 A,所以當 D 在實例化時,A 的構造函數被執行了兩次。這就是所謂的重復調用問題。 很顯然,我們只需要調用一次就可以了,重復的調用只會造成資源浪費。

接下來我們使用 super() 函數來調用:

>>> 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 查看輸出結果我們發現雖然解決了重復調用問題,但是輸出結果的順序好像與我們想的有所區別。我們的慣性思維是:先執行 D 類的 __init__() 方法,接著調用 B 類的 __init__() 方法,B 類的構造方法中又調用了父類 A 的 __init_() 方法,然后再是調用 C 類的 __init_() 方法,該方法也調用了父類 A 的 __init__() 方法。所以執行的結果應該是:打印屬性 d,打印屬性 b,打印屬性 a,打印屬性 c。 為何結果不是我們想的那樣呢,首先我們要知道 D 類中的第二個參數 self 為 D 的實例 d,它提供的 MRO 為:D→B→C→A→object。所以 D 類中的 super() 函數產生的是 d 的代理對象,當其調用父類 B 的 __init__() 時,B 的 super() 的第二個參數為 D 中的 super object,其所提供的 MRO 依舊為:D→B→C→A→object。也就是說 B 中的 super() 調用的是它的上一級 C 中的 __init__() ,而不是 A 中的 __init__()。所以執行的結果是:打印屬性 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) 返回的是一個無效的對象,或者是未綁定的 super object。

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

標簽: Python 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日韩一级黄色大片| 国产精品乱码| 亚洲自拍高清| 国产精品视频yy9299一区| 99国产精品国产精品久久| 欧美videofree性高清杂交| 风间由美一区二区av101| 日韩欧美亚洲国产另类| 成人久久视频在线观看| 精品成人一区二区三区| av在线播放不卡| 久久这里只有精品首页| eeuss鲁片一区二区三区 | www激情久久| 91在线精品一区二区| 久久久久久电影| 欧美bbbxxxxx| 中文字幕av一区二区三区免费看 | 亚洲国产一区二区精品专区| 国产精品不卡一区| 在线视频免费在线观看一区二区| 亚洲精品国产精品乱码不99 | 国内精品99| 中文字幕亚洲精品在线观看| 亚洲国产二区| 亚洲欧美日韩国产手机在线| 亚洲一区网站| 日韩精品一二区| 欧美无砖专区一中文字| 精品亚洲国内自在自线福利| 日韩女优电影在线观看| 91麻豆国产香蕉久久精品| 国产精品无遮挡| 国产欧美日本| 久久不见久久见免费视频7| 欧美福利一区二区| 99在线热播精品免费| 国产三级精品在线| 一本色道精品久久一区二区三区 | 国产一区二区三区奇米久涩| 亚洲国产cao| 欧美男女性生活在线直播观看| 国产麻豆视频一区| 国产亚洲美州欧州综合国| 精品白丝av| 偷偷要91色婷婷| 欧美精品免费视频| 女同性一区二区三区人了人一| 亚洲欧美在线aaa| 一本一道久久a久久精品| 国产精品一区在线观看你懂的| 久久精品亚洲一区二区三区浴池| 99国产精品99久久久久久粉嫩| 天天综合网 天天综合色| 欧美日韩一级二级| 99在线精品观看| 日韩午夜在线电影| 成人网男人的天堂| 中文字幕精品—区二区四季| 国产成a人亚洲精| 国产精品国产自产拍高清av王其| 色综合久久久久久久久久久| 国产一区二区精品久久99| 久久久久88色偷偷免费| 国产精品推荐精品| 黑人巨大精品欧美一区| 国产日韩欧美一区二区三区乱码| 国产精品手机视频| 国产一区欧美二区| 国产精品污污网站在线观看| 性感少妇一区| 成人国产一区二区三区精品| 亚洲精品日韩一| 久久久精品日韩| 成人黄页在线观看| 一区二区三区成人| 欧美一级日韩一级| 欧美午夜精品久久久久免费视| 亚洲欧美综合另类在线卡通| 日日摸夜夜添夜夜添亚洲女人| 91.com在线观看| 国模一区二区三区| 免费日韩伦理电影| 日韩欧美一区二区三区在线| 亚洲国产精品久久久久久女王 | 中文日韩欧美| 国产精品18久久久久| 亚洲欧美日韩在线| 欧美一二区视频| 一区二区冒白浆视频| 国产激情视频一区二区三区欧美| 亚洲人成伊人成综合网小说| 538在线一区二区精品国产| 亚洲精品日本| 国产91色综合久久免费分享| 亚洲美腿欧美偷拍| 日韩欧美一区二区在线视频| 性色av一区二区怡红| 99久久精品情趣| 轻轻草成人在线| 国产精品免费看片| 在线成人午夜影院| 亚洲制服少妇| 午夜精品偷拍| 国内国产精品久久| 亚洲最色的网站| 久久久久国产精品麻豆| 欧美在线制服丝袜| 国产一区亚洲| 国产成人免费网站| 亚洲成人综合在线| 国产亚洲午夜高清国产拍精品| 色婷婷av一区二区三区大白胸| 欧美午夜不卡影院在线观看完整版免费| 免费在线看一区| 亚洲免费av观看| 久久精品亚洲麻豆av一区二区 | 91精品欧美综合在线观看最新 | 精品国产髙清在线看国产毛片 | 日韩三级高清在线| 91久久免费观看| 亚洲美女色禁图| 99久久综合99久久综合网站| 捆绑变态av一区二区三区| 亚洲美女偷拍久久| 国产亚洲一区二区三区四区| 欧美精品日日鲁夜夜添| 先锋影音国产精品| 亚洲激情精品| 久久精品72免费观看| 亚洲精品国产品国语在线app| 久久网站最新地址| 欧美一区二区在线不卡| 日本久久电影网| 国产农村妇女精品一区二区| 狠狠入ady亚洲精品| 色综合中文字幕国产 | 99精品视频一区二区| 久久99深爱久久99精品| 亚洲一线二线三线视频| 国产精品不卡在线| 久久综合久色欧美综合狠狠| 91精品一区二区三区久久久久久| 欧美在线free| 在线观看不卡一区| 亚洲欧美日韩专区| 国产精品乱码| 99精品视频免费全部在线| 国产一区二区三区无遮挡 | 最新亚洲视频| 欧美视频观看一区| av在线不卡免费看| 大桥未久av一区二区三区中文| 韩国av一区二区三区| 免费在线成人网| 日本在线不卡一区| 天天色天天操综合| 香蕉影视欧美成人| 亚洲一区二区三区中文字幕| 亚洲视频一区二区免费在线观看| 国产精品色在线观看| 国产精品私房写真福利视频| 国产精品萝li| 中文字幕综合网| 亚洲美女视频一区| 夜夜嗨av一区二区三区中文字幕 | 国产欧美日韩精品在线| 亚洲精品一区二区在线观看| 欧美电影免费提供在线观看| 日韩免费电影一区| 精品成人私密视频| 欧美激情一区二区三区在线| 国产精品久久二区二区| 国产精品短视频| 亚洲欧洲中文日韩久久av乱码| 亚洲男人的天堂在线观看| 亚洲精选视频在线| 樱花影视一区二区| 亚洲mv在线观看| 日韩vs国产vs欧美| 久久www免费人成看片高清| 美女视频免费一区| 捆绑调教一区二区三区| 国产一区二区伦理| 成人av免费在线播放| 女主播福利一区| 尹人成人综合网| 国产伦精品一区二区三| 色婷婷综合久久久中文字幕| 欧美日韩一区高清| 日韩三级伦理片妻子的秘密按摩| 欧美精品一区二区三区在线 | 午夜激情一区| 国产一区免费视频| 制服诱惑一区二区| 色视频一区二区| 欧美一区三区二区| 久久午夜国产精品| 中文字幕一区二区三区四区不卡| 亚洲永久精品大片|