Python 的 MRO
Python 3 里,当子类没有定义某个方法时,在调用该方法时会自动去父类里查找并调用,这一机制是基于 Python 的继承和方法解析顺序(MRO, Method Resolution Order)实现
基本原理
Python 类在继承体系中,当调用一个对象的方法时,解释器会按照 MRO 规定的顺序依次查找该方法。MRO 决定了在多重继承场景下,Python 解释器查找方法和属性的顺序。对于单继承,MRO 顺序很简单,先查找子类,若没找到就去父类查找;对于多重继承,Python 3 使用 C3 线性化算法来确定 MRO 顺序。
单继承
class Parent:def print_message(self):print("This is a message from the Parent class.")class Child(Parent):# 子类没有定义 print_message 方法passchild = Child()
child.print_message() # 调用父类的 print_message 方法
输出结果:
This is a message from the Parent class.
Child 类没有定义 print_message 方法,所以调用 child.print_message() 时,Python 解释器会去 Parent 类中查找该方法并调用。
多继承
class A:def method(self):print("Method from class A")class B(A):passclass C(A):def method(self):print("Method from class C")class D(B, C):passd = D()
d.method() # 调用 class C 的 method 方法
输出结果:
Method from class C
D 类继承自 B 和 C,而 B 和 C 又继承自 A。
D 类没有定义 method 方法,Python 解释器会按照 MRO 顺序查找
D 类的 MRO 顺序是 [D, B, C, A, object],所以会先找到 C 类的 method 方法并调用
查看 MRO 顺序
可以使用 __mro__
属性查看类的 MRO 顺序:
print(D.__mro__)
输出结果:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
总结
Python 3 中,当子类没有定义某个方法时,会依据 MRO 顺序自动去父类或其他基类中查找并调用该方法。