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

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

Python類(lèi)的繼承super相關(guān)原理解析

瀏覽:190日期:2022-07-07 14:31:02

看了網(wǎng)上許多關(guān)于super、mro、C3的介紹感覺(jué)沒(méi)有一份很容易初學(xué)者理解的文檔,直接看C3算法的話(huà),比較難理解,也沒(méi)必要,如果掌握一套規(guī)律的話(huà),會(huì)輕松許多。我將網(wǎng)上這些博主的文章進(jìn)行一個(gè)梳理總結(jié),最后形成一套實(shí)用的關(guān)于super、mro、C3的理解介紹。

1、super

super()是一種將子類(lèi)與父類(lèi)聯(lián)系起來(lái)的一種方法,子類(lèi)通過(guò)繼承父類(lèi),可以使用父類(lèi)的方法和屬性,也可以自己定義屬于自己的方法和屬性。super方法主要用在多繼承中,在單繼承時(shí)直接調(diào)用父類(lèi)方法即可

下面這個(gè)是SGD源碼的一部分,根據(jù)這份源碼,

class SGD(Optimizer): def __init__(self, params, lr=required, momentum=0, dampening=0, weight_decay=0, nesterov=False): defaults = dict(lr=lr, momentum=momentum, dampening=dampening, weight_decay=weight_decay, nesterov=nesterov) if nesterov and (momentum <= 0 or dampening != 0): raise ValueError('Nesterov momentum requires a momentum and zero dampening') super(SGD, self).__init__(params, defaults) def __setstate__(self, state): super(SGD, self).__setstate__(state) for group in self.param_groups: group.setdefault(’nesterov’, False)

這是SGD類(lèi)中的代碼

有2點(diǎn)需要補(bǔ)充說(shuō)明:

1、super聯(lián)系父類(lèi)的時(shí)候,需要調(diào)用父類(lèi)的方法,包括所帶的形參寫(xiě)完整,子類(lèi)不夠的形參需要額外加上

2、super聯(lián)系父類(lèi)的時(shí)候,不只是可以調(diào)用__init__,而且還可以調(diào)用父類(lèi)其他的方法

3、python3可以寫(xiě)成super().__init__()這種寫(xiě)法了。

4、類(lèi)都默認(rèn)繼承object類(lèi)

另外,在super的使用過(guò)程中,還需要注意初始化對(duì)繼承的影響:

1、子類(lèi)繼承父類(lèi),但不執(zhí)行__init__方法,那么會(huì)自動(dòng)繼承父類(lèi)屬性。

2、子類(lèi)繼承父類(lèi),執(zhí)行了__init__方法,且不調(diào)用super初始化父類(lèi)構(gòu)造函數(shù),那么子類(lèi)不會(huì)自動(dòng)繼承父類(lèi)屬性。

3、子類(lèi)繼承父類(lèi),執(zhí)行了__init__方法,且調(diào)用了super初始化了父類(lèi)的構(gòu)造函數(shù),那么子類(lèi)會(huì)繼承父類(lèi)屬性。

2、mro

Python的MRO,方法解析順序,即在調(diào)用方法時(shí),會(huì)對(duì)當(dāng)前類(lèi)以及所有的基類(lèi)進(jìn)行一個(gè)搜索,以確定該方法之所在,而這個(gè)搜索的順序就是MRO。然后python會(huì)按照這個(gè)順序去執(zhí)行類(lèi)之間的調(diào)用問(wèn)題。

直接上例子

class A1(): def __init__(self): print(’A1’) super().__init__()class A2(): def __init__(self): print(’A2’) super().__init__()class A3(): def __init__(self): print(’A3’) super().__init__()class B1(A1, A2): def __init__(self): print(’B1’) super().__init__()class B2(A2): def __init__(self): print(’B2’) super().__init__()class B3(A2, A3): def __init__(self): print(’B3’) super().__init__()class C1(B1): def __init__(self): print(’C1’) super().__init__()class C2(B1, B2): def __init__(self): print(’C2’) super().__init__()class C3(B2, B3): def __init__(self): print(’C3’) super().__init__()class D(C1, C2, C3): def __init__(self): print(’D’) super().__init__()d = D()print(D.__mro__)

輸出如下:

Python類(lèi)的繼承super相關(guān)原理解析

(<class ’__main__.D’>, <class ’__main__.C1’>, <class ’__main__.C2’>, <class ’__main__.B1’>, <class ’__main__.A1’>, <class ’__main__.C3’>, <class ’__main__.B2’>, <class ’__main__.B3’>, <class ’__main__.A2’>, <class ’__main__.A3’>, <class ’object’>)

那么這個(gè)程序是按怎么個(gè)順序依次去執(zhí)行那些方法呢,就是按照MRO中的順序。

Python類(lèi)的繼承super相關(guān)原理解析

那么這個(gè)順序如何自己手寫(xiě)出來(lái)呢?這就是C3算法,用于計(jì)算出MRO,得出執(zhí)行順序

3、c3算法

但是我在這里想告訴大家如何根據(jù)C3算法找出規(guī)律,從而自己寫(xiě)出順序

還是上手例子,根據(jù)上面這個(gè)圖,我們可以列出下面這個(gè)表,這個(gè)表示網(wǎng)上一個(gè)博主做的,可以說(shuō)做出這張表就是做出了答案,那這張表“實(shí)際取出的類(lèi)”怎么推出來(lái)的呢?我拿過(guò)來(lái)提煉出一些比較直接的規(guī)律

Python類(lèi)的繼承super相關(guān)原理解析

規(guī)律1:預(yù)查找父類(lèi)按左邊優(yōu)先原則,比如第一行,當(dāng)前類(lèi)D的預(yù)查找父類(lèi)選最左邊的C1,而不是C2、C3。

規(guī)律2:當(dāng)“預(yù)查找父類(lèi)是否還有其他子類(lèi)?同時(shí)又是最底層查找類(lèi)的父類(lèi)或父父類(lèi)、父父父...類(lèi)”沒(méi)有的時(shí)候,直接選取預(yù)查找父類(lèi)作為答案。當(dāng)這項(xiàng)有類(lèi)的時(shí)候,若“最底層的未查找父類(lèi)”還有,則優(yōu)先選它,若沒(méi)有了,則選取這項(xiàng)類(lèi)作為答案。

規(guī)律3:當(dāng)預(yù)查找父類(lèi)是object,只要最底層的未查找父類(lèi)還有,就選這個(gè)最底層的未查找父類(lèi)。若沒(méi)有,則“預(yù)查找父類(lèi)是否還有其他子類(lèi)?同時(shí)又是最底層查找類(lèi)的父類(lèi)或父父類(lèi)、父父父...類(lèi)”有類(lèi)的時(shí)候,就選這個(gè)類(lèi),沒(méi)有的話(huà),答案就是object

另外,

如何去畫(huà)圖:

1、子類(lèi)永遠(yuǎn)畫(huà)在父類(lèi)的下面,并用有向箭頭指向父類(lèi)

2、遇到多繼承則按代碼中繼承列表的順序從左往右寫(xiě)。如果有多個(gè)子類(lèi)繼承了同一個(gè)父類(lèi),那么這個(gè)父類(lèi)則放在它能夠出現(xiàn)的所有位置中最左的位置。需遵循圖里面的廣度優(yōu)先原則進(jìn)行遍歷(在廣度優(yōu)先原則的前提下又優(yōu)先遍歷左邊的):

練習(xí):

下面這個(gè)是網(wǎng)上的一份代碼,看懂上面的規(guī)律以及如何畫(huà)有向圖之后,就可以順利得出MRO的值了

class A: def __init__(self): print(’A’) class B(A): def __init__(self): print(’B’) super().__init__()class C(A): def __init__(self): print(’C’) super().__init__()class D(A): def __init__(self): print(’D’) super().__init__() class E(B, C): def __init__(self): print(’E’) super().__init__()class F(C, D): def __init__(self): print(’F’) super().__init__()class G(E, F): def __init__(self): print(’G’) super().__init__()

首先,畫(huà)圖

Python類(lèi)的繼承super相關(guān)原理解析

然后列表

當(dāng)前類(lèi)最底層未查找的父類(lèi)預(yù)查找的父類(lèi)預(yù)查找父類(lèi)是否為object預(yù)查找父類(lèi)是否有其他子類(lèi),同時(shí)又是最底層查找類(lèi)的父類(lèi)、父父類(lèi)實(shí)際取出的類(lèi)GE、FEnonoEEFBnonoBBFAno有,CFFnoCnonoCCnoAno有,DDDnoAnonoAAnoobjectyesnoobject

答案:

mro:GEBFC

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲国产不卡| 黄色免费成人| 久久久久久美女精品| 亚洲欧美不卡| 久久精品国产成人一区二区三区| 欧洲在线一区| 国产精品亚洲综合久久| 久久国产88| 日韩欧美视频专区| 日本欧美一区二区在线观看| 亚洲福利专区| 国产亚洲精aa在线看| 午夜国产精品视频| 久久久久久婷| 日韩av一区二区在线影视| 激情自拍一区| 高潮久久久久久久久久久久久久| 日本在线不卡视频一二三区| 99久久夜色精品国产亚洲1000部| 国产精品玖玖玖在线资源| 日韩中文欧美在线| 亚洲h色精品| 精品一区二区三区视频在线播放| 亚洲一区av| 激情91久久| 日韩精品欧美| 国产精品99精品一区二区三区∴| 日韩一区二区久久| 九色porny丨国产首页在线| 免费在线亚洲欧美| 婷婷视频一区二区三区| 午夜日韩福利| 日韩欧美综合| 精品一区二区三区亚洲| 欧美在线首页| 亚洲毛片在线| 久久亚洲一区| 一区在线免费| 99精品一区| 国产传媒在线| 精品三级在线观看视频| 日本不卡一区二区三区| 免费成人在线影院| 国产视频一区在线观看一区免费| 久久久精品久久久久久96 | 日韩不卡在线观看日韩不卡视频| 亚洲成人精选| 欧美午夜精彩| 欧美日韩水蜜桃| 亚洲www啪成人一区二区| 国产一区二区三区四区五区 | 国产suv精品一区| 蜜桃久久久久| 国产精品扒开腿做爽爽爽软件| 日韩高清欧美激情| 日韩在线黄色| 日韩av一区二区三区四区| 自拍自偷一区二区三区| 蜜臀国产一区二区三区在线播放| 91久久国产| 欧美91视频| 欧美精品一二| 亚洲女同中文字幕| 伊人成人在线视频| 午夜一区在线| 蜜芽一区二区三区| 日韩国产精品久久久久久亚洲| 日韩精品成人在线观看| 国产日韩免费| 精品伊人久久| 亚洲欧洲美洲av| 久久精品成人| 欧美日韩精品免费观看视频完整| 最新亚洲激情| 在线一区二区三区视频| 婷婷综合成人| 国产精品蜜月aⅴ在线| 免费在线成人| 欧美一级鲁丝片| 成人精品中文字幕| 欧美1区2区3区| 香蕉久久夜色精品国产| 中文字幕日韩欧美精品高清在线| 婷婷五月色综合香五月| 欧美日韩夜夜| 国际精品欧美精品| 久久天堂成人| 六月婷婷一区| 欧美一区二区三区免费看| 国产精品久久亚洲不卡| 日本欧美国产| 国产韩日影视精品| 日韩一区二区三区精品| 免费一级欧美片在线观看网站| 国产成人精品一区二区三区免费| 国产亚洲一区二区手机在线观看 | 国产99久久久国产精品成人免费| 最新亚洲一区| 日韩中文av| 久久中文字幕一区二区三区| 免费在线小视频| 亚洲免费婷婷| 欧美久久久网站| 鲁大师精品99久久久| 亚洲成人不卡| 首页国产欧美日韩丝袜| 国产乱码精品一区二区三区亚洲人 | 国产一二在线播放| 亚洲婷婷在线| 日韩国产欧美在线播放| 四虎国产精品免费观看| 亚洲手机在线| 日韩不卡一二三区| 日本黄色精品| 六月婷婷一区| 久久一区视频| 欧美日韩国产探花| 国产精品2区| 国产精品av一区二区| 日韩高清电影一区| 久久国产日本精品| 日韩欧美中文字幕电影| 不卡专区在线| 中文无码日韩欧| 成人午夜毛片| 中文字幕中文字幕精品| 成人精品动漫一区二区三区| 日韩一级不卡| 麻豆国产欧美一区二区三区| 午夜国产精品视频免费体验区| 国产精品天天看天天狠| 人人精品亚洲| 国产精品日本一区二区三区在线| 久久中文字幕av一区二区不卡| 欧美另类中文字幕| 免费av一区二区三区四区| 国产精品调教视频| 先锋影音国产一区| 在线看片国产福利你懂的| 亚洲影视一区二区三区| 中文字幕人成乱码在线观看| 日韩中文字幕一区二区高清99| 久久精品影视| 久久不见久久见国语| 黄色成人在线网址| 国产一区国产二区国产三区| 亚洲图片久久| 欧美一级精品| 精品国产一区二| 日韩一区二区三区四区五区| 国产在线不卡| 久久精品系列| 少妇精品久久久一区二区| 久久久精品日韩| 麻豆精品国产91久久久久久| 首页亚洲欧美制服丝腿| 国产麻豆久久| 精品国产一区二| 日韩一区免费| 五月天久久777| 97人人精品| 国产精品视频一区视频二区| 久久xxxx| 精品一区在线| 日韩欧美午夜| 精品72久久久久中文字幕| 91成人精品在线| 喷白浆一区二区| 欧美日韩在线观看视频小说| 麻豆国产精品一区二区三区 | 91视频精品| 国产精品一区二区三区四区在线观看 | 国产精品多人| 亚洲三级在线| 蜜桃tv一区二区三区| 国产传媒av在线| 久久影院资源站| 国产日韩在线观看视频| 亚洲午夜免费| 一本色道精品久久一区二区三区| 日本少妇一区| 黑森林国产精品av| 精品久久久网| 久久99久久人婷婷精品综合| 日韩超碰人人爽人人做人人添| 亚洲精品看片| 男女男精品网站| 妖精视频成人观看www| 久久中文字幕av| 精品欧美一区二区三区在线观看| 精品国产鲁一鲁****| 国产伦精品一区二区三区视频 | 午夜影院一区| 国产不卡av一区二区| 免费一区二区三区在线视频| 欧美黄页在线免费观看| 国产日韩三级| 国产精品15p| 国产精品宾馆| 美女免费视频一区|