Понимание порядка разрешения методов (Method Resolution Order, MRO)
На этом этапе вы узнаете о порядке разрешения методов (Method Resolution Order, MRO) в Python. MRO - это порядок, в котором Python ищет метод в иерархии классов. Это особенно важно при использовании множественного наследования.
Создадим новую группу классов, чтобы проиллюстрировать MRO. Создайте файл с именем animal.py
в каталоге ~/project
с помощью редактора VS Code:
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
.
Теперь создадим новый файл с именем mro_example.py
в каталоге ~/project
, чтобы продемонстрировать 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 сначала ищет метод speak
в классе Dog
. Если он не найден там, Python ищет его в классе Mammal
, а затем в классе Animal
. Этот порядок определяется MRO.
Чтобы запустить скрипт mro_example.py
, откройте терминал и перейдите в каталог ~/project
:
cd ~/project
Затем выполните скрипт с помощью команды python
:
python mro_example.py
Вы должны увидеть следующий вывод:
Woof!
Meow!
Теперь рассмотрим более сложный пример с множественным наследованием. Создайте новый файл с именем mro_complex.py
в каталоге ~/project
:
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
показывает, что вызывается метод method
из класса B
. Метод D.mro()
возвращает кортеж, представляющий порядок разрешения методов для класса D
. В этом случае MRO имеет вид D -> B -> C -> A -> object
. Это означает, что когда вы вызываете d.method()
, Python сначала ищет метод в классе D
, затем в классе B
, затем в классе C
, затем в классе A
и, наконец, в базовом классе object
.
Понимание MRO необходимо для предсказания поведения вашего кода при использовании наследования, особенно множественного наследования.