欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python的MRO

系統 1670 0

Python的MRO即Method Resolution Order(方法解析順序),也就是在Python中的類的繼承順序是怎樣的。在Python2.3之前,MRO的實現是基于DFS的,而在Python2.3以后MRO的實現是基于C3算法(我這里兩種算法的具體實現都不詳述)。C3算法最早被提出是用于Lisp的,應用在Python中是為了解決原來基于深度優先搜索算法不滿足本地優先級,和單調性的問題。本地優先級:指聲明時父類的順序,比如C(A,B),如果訪問C類對象屬性時,應該根據聲明順序,優先查找A類,然后再查找B類。單調性:如果在C的解析順序中,A排在B的前面,那么在C的所有子類里,也必須滿足這個順序。

?

總的來說,一個類的 MRO 列表就是合并所有父類的 MRO 列表,并遵循以下三條原則:

子類永遠在父類前面

如果有多個父類,會根據它們在列表中的順序被檢查

如果對下一個類存在兩個合法的選擇,選擇第一個父類

?

下面我用圖解的形式來表現三條原則并計算出MRO(只是說這種方式可以手算出MRO,而不是說這是C3算法的具體實現方式):

首先看以下代碼

            
              class F:
    pass

class E:
    pass

class D:
    pass

class B(D,E):
    pass

class C(D,F):
    pass

class A(B,C):
    pass
            
          

然后我們構建一個繼承順序圖(圖是指數據結構中的圖,不是圖片的圖,當然,無所謂了..@_@|||||..?)

即讓子類用箭頭指向父類,逐層排列成類似下圖這種

Python的MRO_第1張圖片

遇到多繼承則按代碼中繼承列表的順序從左往右寫。如果有多個子類繼承了同一個父類,那么這個父類則放在它 能夠出現的所有位置中最左的位置(注意:如下圖中那樣,D既可以放在B的左上方,又可以放在C的左上方,這種情況下,我們選擇放在B的左上方,因為這樣D在其所在層更加靠左) ,然后讓這些子類指向它,就像下圖中類D那樣。

Python的MRO_第2張圖片

然后依據代碼就可以形成上面的這個繼承順序圖。(在python中,任何類默認都是繼承自object類的,所以讓最上層的D、E、F指向object。當然,你也可以選擇在畫圖的時候將A,B,C等等所有類都畫一個指向object的箭頭,但隨著以下方法的進行,其實這兩種畫法結果是一樣的。)

?

接下來,我們就開始算出相應的MRO。即需遵循圖里面的廣度優先原則進行遍歷(在廣度優先原則的前提下又優先遍歷左邊的):

首先尋找整個圖中入度為0的,也就是A,那么A也就成為MRO中的第一個。

然后我們去掉圖中的A節點以及與A相關的連線,再尋找入度為0的點,這時有B和C兩個節點,我們選擇最左邊的點即B。選完左邊的B點后,再選右邊的C點,這樣B和C也就跟著進入了MRO序列,現在MRO序列為{A,B,C}。(注意每次層次遍歷一定要把那一層選完才能選下一層,不能在沒有選C之前跳到選E)

然后去掉B和C以及與它們相關的連線,這時候入度為0的也就是D、E、F了,依次選擇,使D、E、F進入MRO序列。

最后也就使得object進入MRO序列。

?

以上的MRO序列也就是{ABCDEFobject}

使用 類名.mro()可以查閱其MRO表:

?

?

最后說一下super

一般都會說,在類中用super()可以取父類的成員變量和成員方法

更具體地講是super(cls, inst)?,它獲得的是類cls 在實例inst的 MRO 列表中的下一個類。(也就說是實例或者說對象I有一個MRO列表,這個列表中有類C,而我們獲取的就是類C的后面的那個類)

工作原型為

            
              def super(cls, inst):
    mro = inst.__class__.mro()
    return mro[mro.index(cls) + 1]

            
          

這里需要注意的是inst處是一個實例,而不是一個未實例化的類。

故而可以在類里super(B,self).方法? ? ?或者

在類外x=C() 然后super(B,x).方法

?

轉載請標明出處,原文地址:https://blog.csdn.net/come_from_pluto


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美精选在线 | 久久久久久久 | 99在线免费观看 | 九九九久久久久久久爱 | 手机在线看片国产日韩生活片 | 欧区一欧区二欧区三史无前例 | 精品视频在线播放 | 亚洲精品第五页中文字幕 | 人人爽人人看 | 亚洲国产日韩在线一区 | 麻豆一区二区99久久久久 | 亚洲一区二区三区免费视频 | 亚洲国产一区二区三区四区色欲 | 五月婷婷狠狠爱 | 国产成人免费无庶挡视频 | 精精国产xxxx视频在线 | 91av久久| 欧美一级做a爰片久毛片潮 日本久久视频 | 国产成人精品免费久久久久 | 欧美亚洲一区二区三区四区 | 日日麻批的全部过程 | 中文在线免费观看 | 日韩精品一区二区三区免费观看 | 国产一有一级毛片视频 | 天堂av资源 | 国产精品福利在线观看 | 日韩在线免费视频 | 激情黄视频 | 亚洲AV久久无码精品九九九小说 | 黄色网址在线播放 | 波多久久亚洲精品AV无码 | 激情综合婷婷久久 | 久久99精品国产 | 亚洲精品国产自在久久出水 | 亚洲一区电影 | 亚洲a网 | 欧美亚洲理伦电影毛片在线播放 | 欧美日韩国产在线观看 | 49pao强力免费打造在线高清 | 韩国男女无遮挡高清性视频 | 91视频电影|