1. 程式人生 > 其它 >Python - 面向物件程式設計 - 多繼承

Python - 面向物件程式設計 - 多繼承

繼承的詳解

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