天天看点

类的继承super

提起mro,不得不提继承

继承:一个类继承了另外一个类,即这个类拥有了被继承类的一些属性和方法

函数的继承的方式有两种:

①通过父类.方法名来继承

②通过super().父类方法继承

super是一个类!!!!

对于单继承(一个类只继承了一个类)来讲:这两种方式没有多大的区别

但在多继承中,如果使用父类.方法名来继承,则需要在每一个子函数中使用。但如果改变了父类的名称,则需要在每一个需要调用父类的地方改名字。所以,我们可以使用python的super

例:

类的继承super

结果是:

A

函数B:

A

B

函数c:

A

C

由此可见:在多继承中,使用super当父类名称改变时,改动的行数少

而在多继承的问题中,会出现一种情况:

类的继承super

大家可以看到,B继承于A,C继承与A,而D继承于B,C。那么问题来了,D是继承于B的accept(),还是C的accept()。这就是二义性的体现

上面的程序的结果是:

类的继承super

那么,为什么是这个顺序呢?

首先,大家需要了解一下拓扑排序,它的实现有两步:

①选择入度为0 的顶点输出

②删除这个顶点和边

而我们要讲到的mro算法(python3 使用的是c3算法,基于深度搜索优先)就使用到了拓扑排序。那A,B,C,D中的继承关系是什么样的?

类的继承super

首先,在图中,D的入度为0,输出D,然后删除D以及它的边,然后入度为0的顶点有B,C,因为B在C前面继承,所以先删除B和它的边,接着入度为0的顶点只有C,删除后,入度为0就只有A,最后是object…所以最后的继承顺序是:D,B,C,A,object.