多重繼承都會讓python初學者很疑惑,哪怕當時看完,過一段時間也就遺忘了,因此寫下了本文,希望藉此能夠讓python初學者能夠比較深刻的記住。
多重繼承查詢父類的方法有兩種:
1、深度優先---針對經典類,即python2.2之前和python2.7
2、c3演算法---針對新式類
一、深度優先:
可從某個定點v出發,訪問此頂點,然後一次從v的違背訪問的鄰接點觸發深度優先遍歷圖,直至途中所有和v有路徑相同的頂點都被訪問到;若此時途中尚有頂點未被訪問,則另選途中乙個未曾被訪問的頂點做開始點。
例:
結果:v1, v2, v4, v5, v3, v7, v6
2、c3 mro演算法:
這裡的關鍵在於 merge,其輸入是一組列表,按照如下方式輸出乙個列表:
1)檢查第乙個列表的頭元素(如 l[b] 的頭),記作 h。
l[b]=[b]+l[d]+l[e]+[d]+[e]
=[b] + merge([d,object],[e,object],[d],[e])
=[b,d] + merge([object],[e,object],[e])
=[b,d,e,object]
其中,[b,d,e,object]中的b代表頭,其他都是尾
2)若 h 未出現在其它列表的尾部,則將其輸出,並將其從所有列表中刪除,然後回到步驟1;否則,取出下乙個列表的頭部記作 h,繼續該步驟。
上面的merge([d,object],[e,object],[d],[e])中,d未出現其他列表的尾部所以輸出d
3) 重複上述步驟,直至列表為空或者不能再找出可以輸出的元素。如果是前一種情況,則演算法結束;如果是後一種情況,說明無法構建繼承關係,python 會丟擲異常。
如果出現merge([d,e,object],[e,d,object],[d],[e]),即d又是[e,d,object]的尾,而e又是[d,e,object]的尾,d和e都不能輸出,即出現了d和e相互繼承的關係,會拋異常
其實舉個例子更能說明問題:
結果大概是這樣:
mro(a)=[a] + merge(mro(b),mro(c),[b,c])
mro(b) = [b] + mro(d)
mro(d)=[d,o]
所以:mro(a)= [a] + merge(mro(b),mro(c),[b,c])
= [a] + merge([b,mro(d)],[c,o],[b,c])
由於b不在任何列表的列尾,所以上式等於:
= [a,b]+merge([mro(d)],[c,o],[c])
= [a,b]+merge([d,o],[c,o],[c])
= [a,b,d]+merge([o],[c,o],[c])
= [a,b,d,c,o]
注:對於乙個列表[a,b,c],a為列頭,[b,c]為列尾
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圖,每次輸出乙個入度為零的點 相當於沒有人...