Python 類中你需要了解的三大關係(依賴


Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)


在面向對象的中,類與類之間存在三種關係:依賴關係、組合關係、繼承關係。

1、依賴關係: 將一個類的類名或對象當做參數傳遞給另一個函數被使用的關係就是依賴關係

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

2、組合關係:

將一個類的對象封裝到另一個類的對象的屬性中,就叫組合

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

3、繼承關係

(1)什麼是面向對象的繼承

繼承(英語:inheritance)是面向對象軟件技術當中的一個概念。如果一個類別A“繼承自”另一個類別B,就把這個A稱為“B的子類別”,而把B稱為“A的父類別”也可以稱“B是A的超類”。繼承可以使得子類別具有父類別的各種屬性和方法,而不需要再次編寫相同的代碼。在令子類別繼承父類別的同時,可以重新定義某些屬性,並重寫某些方法,即覆蓋父類別的原有屬性和方法,使其獲得與父類別不同的功能。另外,為子類別追加新的屬性和方法也是常見的做法。

​ 一般靜態的面向對象編程語言,繼承屬於靜態的,意即在子類別的行為在編譯期就已經決定,無法在執行期擴充。

(2)程序中 A(B)

<1> A – 子類,派生類

<2> B – 父類,基類,超類

當我們寫多個類的時候會發現許多問題如:

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

上述代碼重複,這時我們可以簡化相關代碼如:

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

(3)繼承的優點:


  • 減少重複代碼
  • 結構清晰,規範
  • 增加耦合性(耦合性不宜多,在精)


(4)繼承的分類:

<1> 單繼承

<2> 多繼承

Python2: python2.2 之前都是經典類,python2.2之後出現了新式類,繼承object就是新式類 Python3: 只有新式類,不管你繼不繼承object都是新式類

(5)單繼承:

<1> 通過子類的類名使用父類的屬性和方法

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

<2> 通過子類的對象使用父類的屬性和方法

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

(6)查找順序:

<1> 不可逆(就近原則)

<2> 通過子類,類名使用父類的屬性或方法(查找順序):當前類,當前類的父類,當前類的父類的父類---->

<3> 通過子類對象使用父類的屬性或者方法(查找順序):先找對象,實例化這個對象的類,當前類的父類—>

(7)同時使用子類和父類方法或屬性:

<1> 方法一:不依賴(不需要)繼承

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

<2> 方法二:依賴(需要)繼承

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

習題練習:

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

(8)多繼承

多繼承是繼承多個父類

多繼承中, 存在著這樣一個問題. 當兩個⽗類中出現了重名⽅法的時候. 就會涉及到如何查找⽗類⽅法的這麼⼀個問題.即MRO(method resolution order) 問題. 在python中這是一個很複雜的問題. 因為在不同的python版本中使用的是不同的算法來完成MRO的.

(1)經典類:多繼承時從左向右執行

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

總結:

經典類:(深度優先)左側優先,一條路走到頭,找不到會回到起點向右查詢

(2)新式類:採用c3算法 (也有說用廣度優先的 – 不精確)

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

(3)c3 算法的核心 mro

<1> mro() – python提供的可以查看多繼承時的執行順序的一種方法

<2> MRO是一個有序列表L,在類被創建時就計算出來。通用計算公式為:

mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] ) (其中Child繼承自Base1, Base2)

如果繼承至一個基類:class B(A) 這是B的mro序列為

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

如果繼承至多個基類:class B(A1, A2, A3 …) 這時B的mro序列

計算結果為列表,列表中至少有一個元素即類自己,如上述示例[A1,A2,A3]。merge操作是C3算法的核心。

<3> 表頭和表尾

表頭:   列表的第一個元素

表尾:   列表中表頭以外的元素集合(可以為空)

示例   列表:[A, B, C]   表頭是A,表尾是B和C

<4> 列表之間的+操作

+操作:

[A] + [B] = [A, B] (以下的計算中默認省略) ---------------------

merge操作示例:

Python 類中你需要了解的三大關係(依賴 / 組合/ 繼承關係)

<5> 經典類不能使用mro , 新式類才能使用mro


分享到:


相關文章: