Python中多继承是如何通过MRO(Method Resolution Order)机制实现的?

2026-05-16 15:391阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计797个文字,预计阅读时间需要4分钟。

Python中多继承是如何通过MRO(Method Resolution Order)机制实现的?

1. 多继承,首先看下面一个多继承的代码例子: python 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)

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,即上述代码的结果顺序

实例:

若类的继承关系如下图所示,则按照上述规则得出的顺序为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__属性即可查出类的继承关系,实际结果与其一致

Python中多继承是如何通过MRO(Method Resolution Order)机制实现的?

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


本文共计797个文字,预计阅读时间需要4分钟。

Python中多继承是如何通过MRO(Method Resolution Order)机制实现的?

1. 多继承,首先看下面一个多继承的代码例子: python 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)

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,即上述代码的结果顺序

实例:

若类的继承关系如下图所示,则按照上述规则得出的顺序为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__属性即可查出类的继承关系,实际结果与其一致

Python中多继承是如何通过MRO(Method Resolution Order)机制实现的?

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