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