Порядок разрешения методов
Часть раздела Объектно-ориентированное программирование путешествия по 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 APython сначала нашёл метод в классе 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 и т. д.). Используется первый найденный метод.
Задание
СреднеВ этом задании тебе предстоит реализовать иерархию классов.
Тебе нужно отредактировать следующие файлы:
device.py: реализуй базовый классDevicescreen.py: реализуй классScreen, наследующий классDevicecomputer.py: реализуй классComputer, наследующий классDevicelaptop.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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Введение в ООПВнешние файлыКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — простой калькулятор4Наследование
Основы наследованияФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовПовторение: иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»2Декораторы
Введение в декораторыДекоратор свойстваДекоратор статического методаДекоратор метода класса5Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур8Продвинутые концепции ООП
Композиция и наследованиеМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыПовторение — менеджер банковского счёта6Инкапсуляция
Публичные, защищённые и приватные членыМодификаторы доступаСокрытие информацииПродвинутые декораторы свойствПовторение — система учёта студентов12Проект: Система управления библиотекой
Обзор проектаКлассы книг и пользователейСистема выдачи книгФункция поискаИнтерфейс администратораТестирование и интеграцияПотренируйтесь самостоятельно: Онлайн-компилятор Python