什么是MRO
面试题目
- 级别: L2
- 知识模块: Python 编程语言
Python 中的 MRO 是什么?
公司
- 美团
招聘类型
社招
题目解析
此题目是考察对 Python 面象对象的理解深度
答案
- MRO(Method Resolution Order)即方法解析顺序。
- 它是用于确定在多继承情况下,调用方法时搜索方法的顺序。
- 在 Python 中,类的 MRO 顺序是通过 C3 算法计算出来的。
- 解决了早期多继承时可能出现的“菱形继承”和“时间倾斜”等问题。
- 通过调用类的
mro(类名)
方法或类名.__mro__
魔法属性,可以查看该类的方法解析顺序。
- C3 算法简单理解就是在搜索父类时,先去查找当前类的父类的所有子类,当所有子类都查找完毕后,再去查找父类,然后再去查找其它继承关系
- 总结一下就是,先广度查找,再深度查找
示例:
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B,C):
pass
class X:
pass
class Y(X):
pass
class Z(X):
pass
class T(D,Z,Y):
pass
if __name__ == '__main__':
print("T1")
print(T1.mro())
print(T1.__mro__)
print("T2")
print(T2.mro())
print(T2.__mro__)
# 输出
# T1
# (<class '__main__.T1'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.Z'>, <class '__main__.Y'>, <class '__main__.X'>, <class 'object'>)
# (<class '__main__.T1'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.Z'>, <class '__main__.Y'>, <class '__main__.X'>, <class 'object'>)
# T2
# (<class '__main__.T2'>, <class '__main__.Z'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.Y'>, <class '__main__.X'>, <class 'object'>)
# (<class '__main__.T2'>, <class '__main__.Z'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.Y'>, <class '__main__.X'>, <class 'object'>)