Python----多继承和MRO继承机制

网友投稿 342 2022-08-23


Python----多继承和MRO继承机制

1、多继承

首先看下面一个多继承的代码例子

class A(object): def func(self): print("in A")class B(A): def func(self): A.func(self) print("in B")class C(A): def func(self): A.func(self) print("in C")class D(B,C): def func(self): B.func(self) C.func(self) print("in D")d=D()d.func()

执行结果如下:

in Ain Bin Ain Cin

这里达到了继承的目的,但是有一点问题,A类作为B类和C 类的父类,这里被执行了两次,显然这种处理方式有问题,当然这段代码中也是有一点问题的,需要注意一下,python中在使用继承的时候,调用父类方法绝对不能使用父类名去调用,而是要使用super()去调用,上面这段代码就是使用了父类名去调用了,所以A类被执行了两遍

再看下面一段代码

class A(object): def func(self): print("in A")class B(A): def func(self): super().func() print("in B")class C(A): def func(self): super().func() print("in C")class D(B,C): def func(self): super().func() print("in D")d=D()d.func()

执行结果如下:

in Ain Cin Bin

这里B和C顺序好像变化了,这就是根据python中MRO继承顺序机制而调用的结果

2、MRO原理

MRO继承顺序可以有如下规则计算出来

子类永远在父类前面同一等级的类按照继承的顺序摆放根据上述两条规则确定的顺序,倒过来即为调用顺序

实例:

比如如下继承关系,按照上述规则的顺序为:D,B,C,A,反过来即为A,C,B,D,即上述代码的结果顺序

实例:

若类的继承关系如下图所示,则按照上述规则得出的顺序为A,B,C,D,E,F,则调用顺序为F,E,D,C,B,A

3、查看MRO属性的方法

在实际代码调试过程中,不需要画图去分析调用顺序,python代码内置提供了一个属性,供查询类的继承关系,如下

class A(object): def func(self): print("in A")class B(A): def func(self): super().func() print("in B")class C(A): def func(self): super().func() print("in C")class D(B,C): def func(self): super().func() print("in D")d=D()print(D.__mro__)d.func()

执行结果如下:可以看出通过类的__mro__属性即可查出类的继承关系,实际结果与其一致

(, , , , )in Ain Cin Bin


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mybatis多表查询的实现(xml方式)
下一篇:Python----global和nolocal关键字的用法(python global nonlocal)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~