1. 程式人生 > 實用技巧 >python3中supper和繼承順序

python3中supper和繼承順序

"""
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()