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

  



posted @ 2020-12-20 13:13  Yuan_x  阅读(240)  评论(0编辑  收藏  举报