Skip to content

什么是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'>)