Порядок разрешения методов
Часть раздела 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 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__, но в виде списка.
Ключевой момент: Python ищет методы в порядке MRO — сначала в самом классе (индекс 0), затем в родительских классах слева направо, как они указаны в определении класса (индексы 1, 2 и т. д.). Используется первый найденный метод.
Задание
СреднеВ этом испытании вы реализуете иерархию классов.
Вам нужно будет отредактировать следующие файлы:
device.py: Реализуйте базовый классDevicescreen.py: Реализуйте классScreen, который наследуется отDevicecomputer.py: Реализуйте классComputer, который наследуется отDevicelaptop.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 listPython ищет методы в порядке 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела 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