Проверяет знание MRO (Method Resolution Order) в Python при наследовании от нескольких классов.
Python ищет методы в порядке MRO (Method Resolution Order), который определяется алгоритмом C3. Порядок можно посмотреть через Class.__mro__. Поиск идёт слева направо и от подкласса к суперклассам, избегая повторных проверок.
Множественное наследование — когда класс наследуется от нескольких родителей. Проблема: если методы совпадают, какой вызвать? Решение — MRO.
Как определяется порядок:
Используется алгоритм C3 для построения линеаризации.
Порядок зависит от порядка родителей в объявлении класса.
Пример:
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 = D()
d.method() # Выведет "B" (первый родитель)
print(D.__mro__) # (D, B, C, A, object)Правила MRO:
Поиск начинается с текущего класса.
Далее идёт к первому родителю, затем к его родителям.
После переходит ко второму родителю и т.д.
Класс не проверяется дважды (монотонность).
Конфликты:
Если порядок не может быть разрешён (например, несовместимые иерархии), Python вызовет TypeError.
Вывод:
MRO гарантирует предсказуемый порядок поиска методов. Старайтесь избегать сложных иерархий.