当前位置 : 主页 > 编程语言 > python >

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

来源:互联网 收集:自由互联 发布时间:2022-08-10
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 ) pri

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 A
in B
in A
in C
in

这里达到了继承的目的,但是有一点问题,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 A
in C
in B
in

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

2、MRO原理

  • MRO继承顺序可以有如下规则计算出来
  • 子类永远在父类前面
  • 同一等级的类按照继承的顺序摆放
  • 根据上述两条规则确定的顺序,倒过来即为调用顺序

实例:

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

Python----多继承和MRO继承机制_调用顺序

实例:

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

Python----多继承和MRO继承机制_父类_02

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__属性即可查出类的继承关系,实际结果与其一致

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
in A
in C
in B
in


上一篇:Python----抽象类的使用方法和使用场景
下一篇:没有了
网友评论