Sobes.tech
Back to questions
Junior — Middle
59

Объясните принцип определения порядка вызова методов при множественном наследовании в Python 2.

Companies where asked
Trip

Answer from AI

sobes.tech AI

В Python 2 порядок вызова методов при множественном наследовании определяется с помощью алгоритма C3-линеаризации, который формирует последовательность классов (MRO — Method Resolution Order).

Принцип работы:

  • Для нового стиля классов (наследующих от object) используется C3-линеаризация.
  • MRO строится так, чтобы сохранить порядок наследования, при этом разрешая конфликты и избегая неоднозначностей.
  • При вызове метода Python ищет его в классах согласно MRO слева направо.

Пример:

class A(object):
    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__)

Здесь метод method вызывается из класса B, так как MRO для D будет (D, B, C, A, object).

Для старых стиля классов (без наследования от object) используется другой алгоритм — поиск в глубину слева направо, что может привести к неоднозначностям.