类的继承super

提起mro,不得不提继承
继承:一个类继承了另外一个类,即这个类拥有了被继承类的一些属性和方法
函数的继承的方式有两种:
①通过父类.方法名来继承
②通过super().父类方法继承
super是一个类!!!!
对于单继承(一个类只继承了一个类)来讲:这两种方式没有多大的区别
但在多继承中,如果使用父类.方法名来继承,则需要在每一个子函数中使用。但如果改变了父类的名称,则需要在每一个需要调用父类的地方改名字。所以,我们可以使用python的super
例:
在这里插入图片描述
结果是:
A
函数B:
A
B
函数c:
A
C
由此可见:在多继承中,使用super当父类名称改变时,改动的行数少
而在多继承的问题中,会出现一种情况:
在这里插入图片描述
大家可以看到,B继承于A,C继承与A,而D继承于B,C。那么问题来了,D是继承于B的accept(),还是C的accept()。这就是二义性的体现
上面的程序的结果是:
在这里插入图片描述
那么,为什么是这个顺序呢?
首先,大家需要了解一下拓扑排序,它的实现有两步:
①选择入度为0 的顶点输出
②删除这个顶点和边
而我们要讲到的mro算法(python3 使用的是c3算法,基于深度搜索优先)就使用到了拓扑排序。那A,B,C,D中的继承关系是什么样的?
在这里插入图片描述
首先,在图中,D的入度为0,输出D,然后删除D以及它的边,然后入度为0的顶点有B,C,因为B在C前面继承,所以先删除B和它的边,接着入度为0的顶点只有C,删除后,入度为0就只有A,最后是object…所以最后的继承顺序是:D,B,C,A,object.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值