一文詳解python多繼承的3C算法
python多繼承的3C算法
有很多地方都說python多繼承的繼承順序,是按照深度遍歷的方式,其實(shí)python多繼承順序的算法,不是嚴(yán)格意義上的深度遍歷,而是基于深度遍歷基礎(chǔ)上優(yōu)化出一種叫3C算法
python多繼承的深度遍歷
class C: def run(self): print("這個是C類的方法"); pass; class A(C): # def run(self): # print("這個是A類的方法"); pass; class B: def run(self): print("這個是B類的方法"); class MainC(A,B): pass; # def run(self): # print("這個是子類的方法"); m1 = MainC(); m1.run(); print(MainC.mro())
這段代碼輸出的結(jié)果就是 這個是C類的方法 [<class 'main.MainC'>, <class 'main.A'>, <class 'main.C'>, <class 'main.B'>, <class 'object'>]
每個類如果沒有繼承其他類的話就默認(rèn)繼承object這個基類 這個是比較正常的多繼承,然后是深度遍歷的方式
重復(fù)繼承的問題
基于上面改造一下
class C: def run(self): print("這個是C類的方法"); pass; class A(C): # def run(self): # print("這個是A類的方法"); pass; class B(C): def run(self): print("這個是B類的方法"); class MainC(A,B): pass; # def run(self): # print("這個是子類的方法"); m1 = MainC(); m1.run(); print(MainC.mro())
這個繼承順序就有意思了,main繼承A和B,A繼承C,B也繼承C,這就出現(xiàn)了重復(fù)繼承的問題,那這種情況python是如何決定繼承順序的呢 輸出結(jié)果:
這個是B類的方法 [<class '__main__.MainC'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>]
這個結(jié)果就出乎意料了,因?yàn)榘凑丈疃缺闅v的方式的話,也應(yīng)該繼承C再繼承B,但是卻不是這樣的 這個是因?yàn)閜ython對于重復(fù)繼承的處理,按照這個繼承方式的話繼承順序是這樣的 mianC先繼承A,然后到查看C的情況,發(fā)現(xiàn)C同時被A和B繼承了,然后就先不處理,接著繼承B,然后看C的時候發(fā)現(xiàn),沒有其他的繼承了,就接著繼承C
更加復(fù)雜的繼承
class F: def run(self): print("這個是F類的方法"); pass; class G: def run(self): print("這個是G類的方法"); pass; class E(F,G): def run(self): print("這個是E類的方法"); pass; class C(E): def run(self): print("這個是C類的方法"); pass; class D(E): def run(self): print("這個是D類的方法"); class A(C): # def run(self): # print("這個是A類的方法"); pass; class B(D): def run(self): print("這個是B類的方法"); class MainC(A,B): pass; # def run(self): # print("這個是子類的方法"); m1 = MainC(); m1.run(); print(MainC.mro())
繼承順序:
[<class '__main__.MainC'>, <class '__main__.A'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.E'>, <class '__main__.F'>, <class '__main__.G'>, <class 'object'>]
這個就是跟復(fù)雜的多繼承了,但是只要用到上面說的邏輯去推理就知道繼承順序了 mainc先繼承A,然后看C,沒有被重復(fù)繼承,就繼承C,再看E,E被重復(fù)繼承了,先不處理,再從上面開始看,看B,沒有被重復(fù)繼承,再看D也沒有被重復(fù)繼承,直接繼承,再看E,也沒有其他的再繼承了就可以直接繼承,然后再看F,沒有重復(fù)繼承,就繼承,再到G
這個就是實(shí)際上python多繼承順序的算法,如果單純說是深度遍歷,其實(shí)是不對的
注意
盡量不要用多繼承,盡量不要用多繼承,盡量不要用多繼承。 用多繼承會讓你的程序變得復(fù)雜又難讀,產(chǎn)生的bug也難查
到此這篇關(guān)于一文詳解python多繼承的3C算法的文章就介紹到這了,更多相關(guān)python 3C算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中的十大%占位符對應(yīng)的格式化的使用方法
本文主要介紹了python中的十大%占位符對應(yīng)的格式化的使用方法,它可以很好的幫助我們解決一些字符串格式化的問題, 文中通過示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下2022-01-01pyecharts繪制中國2020肺炎疫情地圖的實(shí)例代碼
在本篇文章里小編給大家整理的是關(guān)于pyecharts繪制中國2020肺炎疫情地圖的實(shí)例代碼內(nèi)容,有興趣的朋友們可以測試下。2020-02-02Python訪問MongoDB,并且轉(zhuǎn)換成Dataframe的方法
今天小編就為大家分享一篇Python訪問MongoDB,并且轉(zhuǎn)換成Dataframe的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10Django配置celery(非djcelery)執(zhí)行異步任務(wù)和定時任務(wù)
這篇文章主要介紹了Django配置celery(非djcelery)執(zhí)行異步任務(wù)和定時任務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07Python爬蟲庫requests-html進(jìn)行HTTP請求HTML解析等高級功能應(yīng)用
這篇文章主要為大家介紹了Python爬蟲庫requests-html進(jìn)行HTTP請求HTML解析JavaScript渲染以及更高級的功能應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Python數(shù)據(jù)分析之matplotlib繪圖詳解
這篇文章主要為大家詳細(xì)介紹了Python數(shù)據(jù)分析之如何利用matplotlib進(jìn)行繪圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-09-09用python記錄運(yùn)行pid,并在需要時kill掉它們的實(shí)例
下面小編就為大家?guī)硪黄胮ython記錄運(yùn)行pid,并在需要時kill掉它們的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01