繼承的詳解
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