MRO 的全称是:Method Resolution Order
,从 Python2.3 开始,Python 使用 C3 算法来实现 Python 类继承时的线性解析逻辑。
关于 MRO 的更多信息可以到 Python 官网查看:https://docs.python.org/zh-cn/3/howto/mro.html#python-2-3-mro
关于 C3 算法的解释可以查看:https://en.wikipedia.org/wiki/C3_linearization
当然也可以去搜索C3 算法相关论文:《A Monotonic Superclass Linearization for Dylan》
class A(object):
def hello(self):
print(self.__class__, 'A')
if __name__ == '__main__':
print('A MRO:', A.mro())
A().hello()
上面是最简单的类定义,通过调用 A.mro()即可以看到被线性化
的类列表。
class A(object):
def hello(self):
print(self.__class__, 'A')
class B(A):
def hello(self):
print(self.__class__, 'B')
if __name__ == '__main__':
print('B MRO:', B.mro())
B().hello()
这里的继承比较简单直观,本身就是线性继承
的,即 object --> A --> B,它的 MRO 长这样子:
class A(object):
def hello(self):
print(self.__class__, 'A')
class B(object):
def hello(self):
print(self.__class__, 'B')
class C1(A, B):
pass
class C2(B, A):
pass
if __name__ == '__main__':
print('C1 MRO:', C1.mro())
C1().hello()
print('C2 MRO:', C2.mro())
C2().hello()
C1 和 C2 都继承了 A 和 B,只不过顺序不一样,此时他们的 MRO 和 hello 方法的执行逻辑发生了微妙的变化:
class A(object):
def hello(self):
print(self.__class__, 'A')
class B(object):
def hello(self):
print(self.__class__, 'B')
class C1(A):
pass
class C2(C1, B):
pass
if __name__ == '__main__':
print('C2 MRO:', C2.mro())
C2().hello()
class A(object):
def hello(self):
print(self.__class__, 'A')
class B(A):
def hello(self):
print(self.__class__, 'B')
class C1(A):
pass
class C2(C1, B):
pass
if __name__ == '__main__':
print('C2 MRO:', C2.mro())
C2().hello()
此时 C1 和 B 都继承自 A,而 C2 又分别继承了 C1 和 B,且 C1 自身没有实现 hello 方法,B 自身实现了 Hello 方法,此时的 MRO 为:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。