tgoop.com/hw_code/605
Create:
Last Update:
Last Update:
В каком то из давних интервью меня попросили предсказать вывод следующего Python-кода:
class A:
pass
class B:
value = 1
class C:
value = 3
class D(A, B, C):
def __str__(self):
return str(self.value)
print(D())
Эту проблему на тот момент я не мог решить, но я ее запомнил и вернулся к ней только недавно. Ключ к решению этой задачи лежит в понимании т.н. Method Resolution Order (MRO) в Python. MRO определяет порядок, в котором происходит поиск базовых классов при обращении к методу или атрибуту.
💡 В данном случае
D
наследуется от A
, B
и C
. Но когда мы печатаем D()
, атрибут value
берётся из класса B
! Почему?Вот объяснение:
1️⃣ Python ищет
value
в классе D
.2️⃣ Затем он смотрит в
A
, но A
не имеет value
.3️⃣ Далее он проверяет
B
— и находит value = 1
.Поскольку
B
стоит перед C
в MRO, используется value
из B
, поэтому вывод будет 1
! ⚙️Вы можете увидеть MRO с помощью
D.mro()
:
[<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>]
@hw_code
BY Hello World
Share with your friend now:
tgoop.com/hw_code/605