理解方法解析顺序(MRO)
在这一步中,你将了解 Python 中的方法解析顺序(Method Resolution Order,MRO)。MRO 是 Python 在类层次结构中搜索方法的顺序。在处理多重继承时,它尤为重要。
让我们创建一组新的类来演示 MRO。使用 VS Code 编辑器在你的 ~/project
目录中创建一个名为 animal.py
的文件:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "Generic animal sound"
class Mammal(Animal):
def speak(self):
return "Generic mammal sound"
class Dog(Mammal):
def speak(self):
return "Woof!"
class Cat(Mammal):
def speak(self):
return "Meow!"
保存 animal.py
文件。
现在,让我们在 ~/project
目录中创建一个名为 mro_example.py
的新文件,以演示 MRO:
from animal import Animal, Mammal, Dog, Cat
my_dog = Dog("Buddy")
my_cat = Cat("Whiskers")
print(my_dog.speak())
print(my_cat.speak())
保存 mro_example.py
文件。
在这个示例中:
Animal
是具有 speak
方法的基类。
Mammal
继承自 Animal
并覆盖了 speak
方法。
Dog
继承自 Mammal
并覆盖了 speak
方法。
Cat
继承自 Mammal
并覆盖了 speak
方法。
当你调用 my_dog.speak()
时,Python 首先在 Dog
类中查找 speak
方法。如果在那里没有找到,它会在 Mammal
类中查找,然后在 Animal
类中查找。这个顺序由 MRO 决定。
要运行 mro_example.py
脚本,请打开终端并导航到 ~/project
目录:
cd ~/project
然后,使用 python
命令执行脚本:
python mro_example.py
你应该会看到以下输出:
Woof!
Meow!
现在,让我们探索一个更复杂的多重继承示例。在 ~/project
目录中创建一个名为 mro_complex.py
的新文件:
class A:
def method(self):
return "A"
class B(A):
def method(self):
return "B"
class C(A):
def method(self):
return "C"
class D(B, C):
pass
d = D()
print(d.method())
print(D.mro())
保存 mro_complex.py
文件。
在这个示例中:
- 类
D
同时继承自 B
和 C
。
B
和 C
都继承自 A
。
method
方法在 A
、B
和 C
这三个类中都有定义。
要运行 mro_complex.py
脚本,请打开终端并导航到 ~/project
目录:
cd ~/project
然后,使用 python
命令执行脚本:
python mro_complex.py
你应该会看到以下输出:
B
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
输出 B
表明调用了类 B
的 method
方法。D.mro()
方法返回一个元组,表示类 D
的方法解析顺序。在这种情况下,MRO 是 D -> B -> C -> A -> object
。这意味着当你调用 d.method()
时,Python 首先在类 D
中查找该方法,然后在类 B
中查找,接着在类 C
中查找,再在类 A
中查找,最后在基类 object
中查找。
理解 MRO 对于在使用继承(尤其是多重继承)时预测代码的行为至关重要。