多继承之MRO

一,python2和python3的区别

  在python2中存在两种类:一个叫经典类,在python2.2之前,一直用的是经典类,经典类如果在基类的根什么都不写,那么它就是根;还有一个叫新式类,在python2.2之后出现的,新式类的特点就是所有基类的根都是object。

  在python3中只存在新式类,所以所有类的根都是object。

二,经典类的MRO

  在经典类中的MRO是采用深度优先遍历方法,我们需要通过画图的方式解决比较复杂的题,然后再通过从左往右,一条路走到底的方式找出MRO。

我们创建一个FOO类的对象,它的MRO就是FOO,H,G,F,D,B,A,C,E

二,新式类的MRO,即C3算法

右边即推算过程,有L(H)=H+L(G)+L(X)+L(F)+GXF的方式一直往上走,到最后推到L(A)=A为止,然后把结果反带回去,即L(B)=BA,直到推到L(H)=HGPMXFDBECANO,在整个过程中,只用前面头和后面的身体比较,身体中没有就出来,有就跳过。也可以用类名.__mro__来获得类的MRO信息。

四,super()

   super()可以帮我们执行MRO中下一个父类的方法,通常super()使用的两个地方:

  1,可以访问父类的构造函数

  2,可以调用父类(MRO)中方法

  

面试题

猜你喜欢

转载自www.cnblogs.com/12345huangchun/p/9960025.html