Этот вопрос проверяет знание порядка разрешения методов (MRO) в Python, который определяет, в каком порядке Python ищет методы в иерархии классов.
MRO (Method Resolution Order) — это порядок, в котором Python ищет методы и атрибуты в классах при наследовании. Он определяется алгоритмом C3-линеаризации, который учитывает порядок наследования и иерархию. Порядок можно узнать с помощью метода ClassName.mro() или функции help(ClassName).
Когда в Python вызывается метод на объекте, интерпретатор ищет его в классах согласно MRO. Если метод не найден в текущем классе, Python переходит к родительским классам в определённом порядке.
Алгоритм C3-линеаризации гарантирует, что порядок MRO:
Сохраняет порядок объявления базовых классов.
Обеспечивает корректность наследования.
Пример:
class A:
def process(self):
print("A")
class B(A):
def process(self):
print("B")
class C(A):
def process(self):
print("C")
class D(B, C):
pass
print(D.mro()) # [<class 'D'>, <class 'B'>, <class 'C'>, <class 'A'>, <class 'object'>]
d = D()
d.process() # "B"
Порядок MRO: D → B → C → A → object. Метод process найден в классе B, и выполнение останавливается.
MRO также используется функцией super(), чтобы найти следующий класс в цепочке.