繼承的詳解
https://www.cnblogs.com/poloyy/p/15216652.html
這篇文章講的都是單繼承,Python 中還有多繼承
Python 多繼承的背景
- 大部分面向對象的編程語言,都只支持單繼承,即子類有且只能有一個父類
- 而 Python 卻支持多繼承(C++也支持多繼承)
- 和單繼承相比,多繼承容易讓代碼邏輯復雜、思路換了一直備受爭議,中小型項目中較少使用,后來的 Java、C#、PHP 取消了多繼承
- 多繼承帶來的問題:多個父類中包含同名的類方法
- Python 的解決方案:根據子類繼承多個父類時這些父類的前后次序決定,即排在前面父類中的類方法會覆蓋排在后面父類中的同名類方法【后面文章詳解】
什么是多繼承
- 子類可以擁有多個父親,並且具有所有父類的屬性和方法
- 兒子可以擁有多個爸爸....爸爸也可以有多個兒子.....
語法格式
class 子類(父類1, 父類2, ...): pass
類圖參考
實際代碼
class A: def test(self): print("test") class B: def demo(self): print("demo") class C(A, B): ... c = C() c.test() c.demo() # 輸出結果 test demo
C 繼承了 A、B,擁有了他們的所有屬性和方法
多繼承帶來的順序問題
問題的提出
如果不同的父類中存在同名的方法,子類對象在調用該方法時,會調用哪一個父類的方法呢?
重點注意
- 正式開發中,如果需要用到多繼承,那么多個父類應該避免使用同名的屬性、方法
- 如果父類存在同名的屬性、方法,應該盡量避免使用多繼承
類圖
實際代碼
class A: def test(self): print("AAA-test") def demo(self): print("AAA-demo") class B: def test(self): print("BBB-test") def demo(self): print("BBB-demo") class C(A, B): ... c = C() c.test() c.demo() # 輸出結果 AAA-test AAA-demo
調用的是父類 A 的方法
如果 C 繼承父類的順序改變一下呢
# 剛剛是 A, B ; 現在是 B, A class C(B, A): ... c = C() c.test() c.demo() # 輸出結果 BBB-test BBB-demo
- 現在變成調用父類 B 的方法了
- 這又是為什么呢?答案就是 Python 的 MRO 方法搜索順序
Python 的 MRO 方法搜索順序
https://www.cnblogs.com/poloyy/p/15226424.html
多繼承結合 super() 的使用呢?
https://www.cnblogs.com/poloyy/p/15223443.html
新式類和舊式類
https://www.cnblogs.com/poloyy/p/15226425.html