Menu
Coddy logo textTech

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

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

Method Resolution Order (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 нашел method в class A first (по индексу 1 в MRO), поэтому он использовал that.

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

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__ возвращает tuple (кортеж), тогда как mro() возвращает list (список).

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


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

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

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