提起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.
类的继承super
最新推荐文章于 2022-07-17 13:19:20 发布