python-面向對象-21-多重繼承/方法解析順序

1.多重繼承基本介紹

Python語言支持多重繼承,一個子類能夠有多個"直接父類",這樣就具有了"多個父類"的方法和屬性。
好處: 讓咱們的類定義的很是靈活 。
壞處: 會破壞"類的總體層次",搞得異常複雜。
因爲絕大多數狀況下,單繼承的方式就能夠知足咱們的需求,同時也是爲了咱們程序的可讀性,穩定性,儘可能避免使用。 python

當使用多重繼承,可能造成複雜的網狀結構,以下圖:
多重繼承造成網狀結構git

因爲建議在實際的生產中,不使用多重繼承的功能,雖然多重繼承的知識點有不少,咱們也只是點到爲止。

2.多重繼承簡單代碼說明

多重繼承示例代碼:github

class A:
    def aa(self):
        print("aa")

class B:
    def bb(self):
        print("bb")


class C(B, A):
    def cc(self):
        print("cc")

c = C()
c.aa()
c.bb()
c.cc()

運行結果:markdown

aa
bb
cc

程序說明:ide

  1. 首先定義類A,其中包含方法aa,而後定義類B,其中包含方法bb,都是很常規的操做
  2. 最後定義類C,並指定首先繼承類B,而後繼承類A,這樣在類C中就包含父類B和父類A的所有方法,即:方法bb和方法aa,在加上自身定義的cc方法,則類C同時具備三個方法。

構成以下繼承結構示意圖:
類繼承關係示意圖spa

  1. 分別執行三個方法,並輸出對應的結果,結果也對應輸出

3.方法解析順序MRO

使用多繼承的時候,若是父類中有相同名字的方法,在子類沒有指定父類名時,解釋器將"從左到右"按順序搜索。
MRO(Method Resolution Order):方法解析順序。咱們能夠經過mro方法()得到類的層次結構,這個在前面說類繼承的時候,已經有介紹,詳細內容能夠參考前面的介紹。方法解析順序也是按照這個"類的層次結構"尋找的。 code

示例代碼:視頻

class A:
    def say(self):
        print("aaa")
        
class B:
    def say(self):
        print("bbb")

class C(A, B):
    pass

class D(B, A):
    pass

c = C()
print(C.mro())
c.say()
print('--' * 20)

d = D()
print(D.mro())
d.say()

運行結果:blog

[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
aaa
----------------------------------------
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
bbb

程序說明:繼承

  1. 首先定義類A,裏面包含方法say()
  2. 而後定義類B, 裏面包含和類A相同名稱的方法say()
  3. 定義類C,指定先繼承類A而後繼承類B,因爲類A和類B裏面存在同名方法,最後採用類A的say()方法
  4. 定義類D,指定先繼承B而後繼承類A,一樣,因爲類B和類A裏面存在同名方法,最後採用類B的say()方法。
  5. 首先輸出類C的類繼承關係,而後執行c.say(),發現的二者順序是一致的,同理對應類D的操做。

備註:
更多精彩博客,請訪問: 聶發俊的技術博客
對應視頻教程,請訪問: python400
完整markdown筆記,請訪問: python400_learn_github
相關文章
相關標籤/搜索