Menu
CoddyTech

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

Часть раздела Объектно-ориентированное программирование путешествия по 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() и __mro__ предоставляют одну и ту же последовательность классов, они различаются типом: __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, которые будут шаг за шагом помогать тебе в реализации.

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

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

def explain_mro(class_name):
    # TODO: Выведите MRO (порядок разрешения методов) для данного класса
    # 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Проверьте себя

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

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Python