Ответ
Множественное наследование — это возможность класса наследовать атрибуты и методы от нескольких родительских классов одновременно. Это позволяет создавать сложные иерархии и комбинировать функциональность, например, с помощью миксинов (mixins).
Главная сложность — разрешение конфликтов, когда у нескольких родительских классов есть методы с одинаковыми именами (известная как "проблема ромба" или Diamond Problem).
Python решает эту проблему с помощью Method Resolution Order (MRO) — алгоритма, который определяет четкий порядок поиска методов в иерархии классов. Этот алгоритм (C3-линеаризация) гарантирует, что каждый класс в иерархии будет просмотрен только один раз.
Пример работы MRO:
class A:
def who_am_i(self):
print("I am A")
class B(A):
def who_am_i(self):
print("I am B")
class C(A):
def who_am_i(self):
print("I am C")
# Порядок наследования (B, C) определяет MRO
class D(B, C):
pass
d_instance = D()
d_instance.who_am_i() # Выведет: I am B
# Можно посмотреть MRO для класса D
# Порядок: D -> B -> C -> A -> object
print(D.__mro__)
# (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
Как это работает:
При вызове d_instance.who_am_i()
Python ищет метод who_am_i
в порядке, заданном MRO:
- Ищет в классе
D
. Не находит. - Ищет в классе
B
. Находит и вызывает его. - Поиск прекращается. Метод из
C
иA
не будет вызван.
Понимание MRO критически важно для предсказуемой работы со сложными иерархиями классов и для корректного использования функции super()
.