Назад к вопросам
Middle
135
questionbank
Что такое MRO (метод разрешения порядка)?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
MRO определяет порядок, в котором Python ищет методы и атрибуты в иерархии наследования классов.
В Python 3 используется C3 Superclass Linearization Algorithm для определения MRO.
- При одиночном наследовании: Порядок прост - сначала текущий класс, затем его родитель, затем родитель родителя и так далее.
- При множественном наследовании: C3 алгоритм обеспечивает монотонность (порядок родительских классов не меняется по отношению друг к другу) и локальную однородность (порядок класса и его непосредственных предков сохраняется).
MRO можно посмотреть с помощью:
- Атрибута
__mro__: кортеж классов в порядке разрешения. - Метода
mro(): возвращает список классов в порядке разрешения. - Функции
help(): выводит MRO в информации о классе.
Пример:
class A:
def method(self):
print("Метод из A")
class B(A):
def method(self):
print("Метод из B")
class C(A):
def method(self):
print("Метод из C")
class D(B, C):
pass
# D.__mro__
# Out: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
# d = D()
# d.method()
# Out: Метод из B
В данном примере MRO для класса D — D -> B -> C -> A -> object. При вызове d.method(), Python сначала ищет его в D (нет), затем в B (есть), и выполняет метод из B.
Понимание MRO критически важно при работе с множественным наследованием для предсказания поведения кода.