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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值