Python中多重繼承之菱形繼承的示例分析-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“Python中多重繼承之菱形繼承的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Python中多重繼承之菱形繼承的示例分析”這篇文章吧。

10年積累的成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有蘄春免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

繼承是面向?qū)ο缶幊痰囊粋€(gè)重要的方式,通過(guò)繼承,子類(lèi)就可以擴(kuò)展父類(lèi)的功能。在python中一個(gè)類(lèi)能繼承自不止一個(gè)父類(lèi),這叫做python的多重繼承(Multiple Inheritance )。

語(yǔ)法

class SubclassName(BaseClass1, BaseClass2, BaseClass3, ...): pass

菱形繼承

在多層繼承和多繼承同時(shí)使用的情況下,就會(huì)出現(xiàn)復(fù)雜的繼承關(guān)系,多重多繼承。

其中,就會(huì)出現(xiàn)菱形繼承。如下圖所示。mark

在這種結(jié)構(gòu)中,在調(diào)用順序上就出現(xiàn)了疑惑,調(diào)用順序究竟是以下哪一種順序呢

  • D->B->A->C(深度優(yōu)先)

  • D->B->C->A(廣度優(yōu)先)

下面我們來(lái)解答下這個(gè)問(wèn)題。

舉個(gè)例子來(lái)看下:

class A():
 def __init__(self):
  print('init A...')
  print('end A...')

class B(A):
 def __init__(self):
  print('init B...')
  A.__init__(self)
  print('end B...')

class C(A):
 def __init__(self):
  print('init C...')
  A.__init__(self)
  print('end C...')

class D(B, C):
 def __init__(self):
  print('init D...')
  B.__init__(self)
  C.__init__(self)
  print('end D...')

if __name__ == '__main__':
 D()

輸出結(jié)果

init D... init B... init A... end A... end B... init C... init A... end A... end C... end D...

從輸出結(jié)果中看,調(diào)用順序?yàn)椋篋->B->A->C->A。可以看到,B、C共同繼承于A,A被調(diào)用了兩次。A沒(méi)必要重復(fù)調(diào)用兩次。

其實(shí),上面問(wèn)題的根源都跟MRO有關(guān),MRO(Method Resolution Order)也叫方法解析順序,主要用于在多重繼承時(shí)判斷調(diào)的屬性來(lái)自于哪個(gè)類(lèi),其使用了一種叫做C3的算法,其基本思想時(shí)在避免同一類(lèi)被調(diào)用多次的前提下,使用廣度優(yōu)先和從左到右的原則去尋找需要的屬性和方法。

那么如何避免頂層父類(lèi)中的某個(gè)方法被多次調(diào)用呢,此時(shí)就需要super()來(lái)發(fā)揮作用了,super本質(zhì)上是一個(gè)類(lèi),內(nèi)部記錄著MRO信息,由于C3算法確保同一個(gè)類(lèi)只會(huì)被搜尋一次,這樣就避免了頂層父類(lèi)中的方法被多次執(zhí)行了,上面代碼可以改為:

class A():
 def __init__(self):
  print('init A...')
  print('end A...')

class B(A):
 def __init__(self):
  print('init B...')
  super(B, self).__init__()
  print('end B...')

class C(A):
 def __init__(self):
  print('init C...')
  super(C, self).__init__()
  print('end C...')

class D(B, C):
 def __init__(self):
  print('init D...')
  super(D, self).__init__()
  print('end D...')

if __name__ == '__main__':
 D()

輸出結(jié)果:

init D... init B... init C... init A... end A... end C... end B... end D...

可以看出,此時(shí)的調(diào)用順序是D->B->C->A。即采用是廣度優(yōu)先的遍歷方式。

補(bǔ)充內(nèi)容

Python類(lèi)分為兩種,一種叫經(jīng)典類(lèi),一種叫新式類(lèi)。都支持多繼承,但繼承順序不同。

新式類(lèi):從object繼承來(lái)的類(lèi)。(如:class A(object)),采用廣度優(yōu)先搜索的方式繼承(即先水平搜索,再向上搜索)。

經(jīng)典類(lèi):不從object繼承來(lái)的類(lèi)。(如:class A()),采用深度優(yōu)先搜索的方式繼承(即先深入繼承樹(shù)的左側(cè),再返回,再找右側(cè))。

Python2.x中類(lèi)的是有經(jīng)典類(lèi)和新式類(lèi)兩種。Python3.x中都是新式類(lèi)。

以上是“Python中多重繼承之菱形繼承的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

標(biāo)題名稱(chēng):Python中多重繼承之菱形繼承的示例分析-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)源:http://bm7419.com/article32/dgdjpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、商城網(wǎng)站、python品牌網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)