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