python3中supper和繼承順序
阿新 • • 發佈:2020-12-20
""" supper() 1 實際上返回的的 是父類的例項 所以 在下方類B中的 super(B, self).go() 實際上 super(B, self) 返回的是A的例項 那麼go調的也是A的go方法 2 如果出現了多繼承例如:class D(B,C)的情況 super(D, self).go() 實際上會例項B,C 但是呼叫的時候會先調C的go方法,在調B的go 方法 然後在調d自己的 應該注意 經典類和新式類的 繼承順序 class D 呼叫super(D, self).go() 所以演算法的計算方法為 順序 D----B----A-----C (找到A之後 在從D找C ) 這裡有點疑惑的是 為什麼沒有走C----A 這是因為A不是一個好的節點 好的節點: 如果 A是一個好的節點 當且僅當搜尋路徑中A之後的節點均不繼承A 例如一下demo 按照深度優先遍歷得到搜尋路徑DBACA 之後python 直譯器 從做往右檢查時發現第三個節點A不是一個好節點 因為A之後的節點C繼承了A所以 將A從搜尋路徑中移除 所以呼叫順序程式設計了 DBAC 打DEBUG也證實了這一點 """ class A(object): def go(self): print("in A go") def stop(self): print("in A stop") def pause(self): raise Exception("not implemented") class B(A): def go(self): super(B, self).go() print("in B go") def stop(self): print("in B stop") class C(A): def go(self): super(C, self).go() print("in C go") def stop(self): print("in C stop") class D(B,C): def go(self): super(D, self).go() print("in D go") def stop(self): print("in D stop") class E(B,C): pass if __name__ == '__main__': a=A() b=B() c=C() d=D() e=E() print("*"*120) a.go() print("*" * 120) b.go() print("*" * 120) c.go() print("*" * 120) print("in d") d.go() print(D.__mro__) print("*" * 120) e.go()