面试题答案
一键面试MRO原理
Python的MRO(方法解析顺序)采用C3线性化算法。该算法确保单调性(即子类的MRO是父类MRO的拓展)以及局部优先级(按照类继承列表从左到右的顺序)。它将每个类的直接父类的MRO列表合并,并按照一定规则生成一个线性化的MRO列表。
MRO作用
- 方法查找:当在类实例上调用方法时,Python会按照MRO顺序在类及其父类中查找方法定义。这确保了在多重继承情况下,方法调用的确定性和一致性。
- 避免重复调用:MRO可以避免在多重继承结构中出现重复调用同一个方法的问题,尤其是在菱形继承结构中。
获取类的MRO的代码
在Python中,可以通过类的 __mro__
属性或者 mro()
方法来获取一个类的MRO。示例代码如下:
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
print(D.__mro__)
# 或者
print(D.mro())
菱形继承结构中MRO的处理
在菱形继承结构中,例如 A
是父类,B
和 C
继承自 A
,D
继承自 B
和 C
。C3线性化算法会按照从左到右的顺序,合并 B
和 C
的MRO列表,并确保 A
只出现一次且在 B
和 C
之后(如果 B
和 C
的MRO列表中都有 A
)。例如上述代码中 D
的MRO列表可能为 [D, B, C, A, object]
,保证了方法查找的正确顺序,避免了多次调用 A
类方法的问题。