Порядок разрешения методов
Часть раздела 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 APython нашел 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 и т. д.). Используется первый найденный метод.
Задание
СреднеВ этом задании вам предстоит реализовать иерархию классов.
Вам потребуется отредактировать следующие файлы:
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 (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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — Простой калькулятор4Наследование
Базовое наследованиеФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовИтоги — Иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy5Полиморфизм
Снова о переопределении методовУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовИтоги — Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыИтоги — Менеджер банковского счета6Инкапсуляция
Public, Protected, Private члены классаМодификаторы доступаСокрытие данныхДекораторы property: продвинутый уровеньИтоги: Система учета студентов12Проект: Управление библиотекой
Обзор проектаКлассы Book и UserСистема выдачи книгФункционал поискаИнтерфейс администратораТестирование и интеграция