在圖論中,拓撲排序(topological sorting)是乙個有向無環圖(dag,directed acyclic graph)的所有頂點的線性序列。且該序列必須滿足下面兩個條件:
例如,下面這個圖:
它是乙個dag圖,那麼如何寫出它的拓撲順序呢?這裡說一種比較常用的方法:
於是,得到拓撲排序後的結果是
下面,我們看看拓撲排序在python多重繼承中的例子
#!/usr/bin/env python3
# -*- coding: utf-8 -*-classa(object):deffoo(self):print('a foo')defbar(self):print('a bar')classb(object):deffoo(self):print('b foo')defbar(self):print('b bar')classc1(a,b):passclassc2(a,b):defbar(self):print('c2-bar')classd(c1,c2):passif__name__=='__main__':print(d.__mro__)
d=d()
d.foo()
d.bar()
首先,我們根據上面的繼承關係構成一張圖,如下我們執行上面的**,發現
print(d.__mro__)
的結果也正是這樣,而這也就是多重繼承所使用的c3演算法啦
為了進一步熟悉這個拓撲排序的方法,我們再來一張圖,試試看排序結果是怎樣的,它繼承的內容是否如你所想
#!/usr/bin/env python3
# -*- coding: utf-8 -*-classa(object):deffoo(self):print('a foo')defbar(self):print('a bar')classb(object):deffoo(self):print('b foo')defbar(self):print('b bar')classc1(a):passclassc2(b):defbar(self):print('c2-bar')classd(c1,c2):passif__name__=='__main__':print(d.__mro__)
d=d()
d.foo()
d.bar()
還是先根據繼承關係構乙個繼承圖最後,我們執行上面的**,發現
print(d.__mro__)
的結果正如上面所計算的結果
最後的最後,python繼承順序遵循c3演算法,只要在乙個地方找到了所需的內容,就不再繼續查詢
python 多重繼承之拓撲排序
在圖論中,拓撲排序 topological sorting 是乙個有向無環圖 dag,directed acyclic graph 的所有頂點的線性序列。且該序列必須滿足下面兩個條件 例如,下面這個圖 它是乙個dag圖,那麼如何寫出它的拓撲順序呢?這裡說一種比較常用的方法 於是,得到拓撲排序後的結果...
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...