Menu
Coddy logo textTech

Порядок разрешения методов

Часть раздела Object Oriented Programming путешествия по Python на Coddy — урок 21 из 64.

Порядок разрешения методов (MRO) — это последовательность, которую Python использует для поиска методов, когда несколько классов имеют одинаковое имя метода.

Вот пример с несколькими классами, имеющими один и тот же метод:

class A:
    def method(self):
        return "Method from A"

class B:
    def method(self):
        return "Method from B"

class C(A, B):
    pass

Проверьте MRO с помощью __mro__:

print(C.__mro__)

Вывод:

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

Атрибут __mro__ — это кортеж, который содержит все классы в порядке разрешения. Первый элемент (__mro__[0]) — это всегда сам класс (C), за которым следуют родительские классы слева направо (A, затем B) и, наконец, встроенный класс object.

Создайте объект и вызовите метод:

c = C()
print(c.method())

Вывод:

Method from A

Python нашел метод в классе A первым (по индексу 1 в MRO), поэтому он использовал именно его.

Измените порядок наследования, чтобы увидеть разницу:

class D(B, A):  # Теперь B идет перед A
    pass

print(D.__mro__)
d = D()
print(d.method())

Вывод:

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Method from B

Теперь Python находит метод B первым, потому что B стоит перед A в списке наследования. Вы можете получить доступ к конкретным классам в MRO, используя индексацию — D.__mro__[0] — это сам D, D.__mro__[1] — это B, а D.__mro__[2] — это A.

Вы также можете использовать метод mro():

print(C.mro())

Это дает тот же результат, что и __mro__, но в виде списка.

Ключевой момент: Python ищет методы в порядке MRO — сначала в самом классе (индекс 0), затем в родительских классах слева направо, как они указаны в определении класса (индексы 1, 2 и т. д.). Используется первый найденный метод.

challenge icon

Задание

Средне

В этом испытании вы реализуете иерархию классов.

Вам нужно будет отредактировать следующие файлы:

  • device.py: Реализуйте базовый класс Device
  • screen.py: Реализуйте класс Screen, который наследуется от Device
  • computer.py: Реализуйте класс Computer, который наследуется от Device
  • laptop.py: Реализуйте класс Laptop с множественным наследованием
  • driver.py - Реализуйте тестовые случаи, которые проверят правильность вашей реализации

Каждый файл содержит подробные комментарии TODO, которые будут направлять вас шаг за шагом в процессе реализации.

Шпаргалка

Порядок разрешения методов (Method Resolution Order, MRO) — это последовательность, которую Python использует для поиска методов, когда несколько классов имеют метод с одинаковым именем.

Проверить MRO можно с помощью __mro__ или mro():

class A:
    def method(self):
        return "Method from A"

class B:
    def method(self):
        return "Method from B"

class C(A, B):
    pass

print(C.__mro__)
print(C.mro())  # Same result as a list

Python ищет методы в порядке MRO — сначала в самом классе, затем в родительских классах слева направо, как они указаны в определении класса:

c = C()
print(c.method())  # "Method from A" - A comes before B

class D(B, A):  # B comes before A now
    pass

d = D()
print(d.method())  # "Method from B" - B comes before A

Попробуйте сами

# TODO: Импортировать все необходимые классы
# from device import Device
# from screen import Screen
# from computer import Computer
# from laptop import Laptop

def explain_mro(class_name):
    # TODO: Вывести MRO (Method Resolution Order) для данного класса
    # TODO: Формат: "MRO for [class name]:" (примечание: БЕЗ пробела после двоеточия)
    # TODO: Использовать class_name.__name__ для получения имени класса
    # TODO: Использовать class_name.__mro__ для получения кортежа MRO
    # TODO: Вывести имя каждого класса в MRO на отдельных строках
    
    # TODO: Создать экземпляр класса
    # TODO: Вызвать power_on() у экземпляра и сохранить результат
    # TODO: Вывести: "Power on result: [result]"
    # TODO: Вывести пустую строку для лучшей читаемости
    pass


# Проверьте свой код
# TODO: Вызвать explain_mro() для каждого класса: Device, Screen, Computer и Laptop
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Object Oriented Programming