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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM