Порядок поиска атрибута при множественном наследовании-2

44. Порядок поиска атрибута при множественном наследовании-2

Условие зададчи: Даны два родительских класса с одноименным атрибутом класса x и дочерний класс, который наследуется сразу от обоих родителей.

class A:
    x = 5

class B:
    x = 10

class C(A, B):
    pass
Спойлеры к решению
Подсказки
  • У класса C используется множественное наследование.
  • Оба родительских класса имеют атрибут x.
  • В Python порядок поиска атрибутов определяется MRO.
  • Для class C(A, B) поиск идёт так: C -> A -> B -> object.
  • Так как у C собственного атрибута x нет, Python сначала найдёт x в классе A.
Решение
class A:
    x = 5

class B:
    x = 10

class C(A, B):
    pass


print(C.x)
print(C.__mro__)

Результат:

5
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

При обращении:

C.x

Python ищет атрибут x по MRO — method resolution order:

C -> A -> B -> object

В самом классе C атрибута x нет. Затем Python смотрит в первый родительский класс A и находит:

x = 5

Поэтому результат:

5

Атрибут B.x равен 10, но до класса B поиск уже не дойдёт, потому что нужный атрибут был найден в A.

Если изменить порядок наследования:

class C(B, A):
    pass


print(C.x)

Результат будет:

10

Потому что MRO изменится:

C -> B -> A -> object