Python 處理多重繼承

2021-09-19 08:25:44 字數 983 閱讀 7792

繼承有很多應用,而多重繼承增加了可選方法和複雜度。

1. 把介面繼承和實現繼承區分開。

使用多重繼承時,一定要明確一開始為什麼建立子類。可能原因有:1.繼承介面,建立子型別,實現是什麼的關係。2.繼承實現,通過重用避免**重複。這兩條經常同時出現,但是一定要明確意圖。通過繼承重用**是實現細節,通常可以換用組合和委託模式,而介面繼承則是框架的支柱。

2.使用抽象基類顯式表示介面

在 python 中,如果類的作用是定義介面,應該明確把它定義為抽象基類。

3.通過混入重用**

如果乙個類的作用是為多個不相關的子類提供方法實現,從而實現重用,但不體現是什麼關係,應該是把那個類明確定義為混入類。從概念上講,混入不定義新型別,只是打包方法,便於重用。混入類絕對不能例項化,而且具體類不能只繼承混入類。混入類應該提供某方面的特定行為,只實現少量關係非常緊密的方法。

4.在名稱中明確指明混入

在 python 中沒有把類宣告為混入的正規方式,所以強烈建議在名稱中加入 ...mixin。

5.抽象基類可以作為混入,反過來則不成立

抽象基類可以實現具體方法,因此也可以作為混入使用。不過,抽象基類會定義型別,而混入做不到。此外,抽象基類可以作為其他類的唯一基類,而混入決不能作為唯一的超類,除非繼承另乙個更具體的混入。

抽象基類是有個侷限是混入沒有的:抽象基類中實現的具體方法只能與抽象基類及其超類中的方法協作,這表明,抽象基類中的具體方法只是一種便利措施,因為這些方法所做的一切,使用者呼叫抽象基類中的其他方法也能做到。

6.不要子類化多個具體類

具體類可以沒有,或最多只有乙個具體超類,也就是說,具體超類中除了這乙個具體超類之外,其餘的都是抽象基類或混入。

7.為使用者提供聚合體

如果抽象聚類或混入的組合對客戶**非常有用,那就提供乙個類,使用易於理解的方法把他們組合起來,這種類稱為聚合類。

8.優化使用物件組合,而不是類繼承

組合和委託可以代替混入,把行為提供給不同的類,但是不能取代介面繼承去定義型別層次結構。

python 多重繼承

python和c 一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫乙個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。對經典類和新式類來說,屬性的查詢順序是不同的。現在我們分別看一下經典類和新式類兩種不同的表現 經典類 usr bin pyth...

Python多重繼承

class printa namea printa def set value self,a self.a a def set namea self,namea printa.namea namea def info self print printa s,s printa.namea,self.a...

python多重繼承

class d object pass class c d pass class b d pass class a b,c pass mro method resolution order 方法解析順序 為了解決多繼承問題 在inspect檔案中 採用aov圖,每次輸出乙個入度為零的點 相當於沒有人...