Как в Python вызвать конкретную реализацию метода, игнорируя порядок MRO?

«Как в Python вызвать конкретную реализацию метода, игнорируя порядок MRO?» — вопрос из категории ООП, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в Python можно явно вызвать реализацию метода из конкретного родительского класса, даже если он переопределен и MRO (Method Resolution Order) по умолчанию выбрал бы другую реализацию. Это делается путем прямого обращения к классу.

Способ: Прямой вызов через класс

Самый простой способ — вызвать метод напрямую у класса-предка, передав экземпляр self в качестве первого аргумента. Это позволяет точно указать, какую версию метода вы хотите использовать.

Пример

class A:
    def process(self):
        print("Processing in A")

class B:
    def process(self):
        print("Processing in B")

# MRO для C: C -> A -> B -> object
class C(A, B):
    def run(self):
        print("--- Running default MRO ---")
        self.process()  # Вызовет A.process() согласно MRO

        print("--- Running specific implementation ---")
        # Явно вызываем реализацию из класса B
        B.process(self)

instance = C()
instance.run()

Вывод:

--- Running default MRO ---
Processing in A
--- Running specific implementation ---
Processing in B

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