Рассмотрим следующую иерархию классов:
class GrandParent:
pass
class Parent1(GrandParent):
pass
class Parent2(GrandParent):
pass
class Child(Parent1, Parent2):
pass
В каком порядке будет производиться поиск метода
Child.x()
? Наивный подход заключается в рекурсивном поиске через все родительские классы, что даст порядок: Child
, Parent1
, GrandParent
, Parent2
. Такой метод используется во многих языках программирования, однако он не совсем логичен, так как Parent2
более специфичен, чем GrandParent
, и его нужно проверять раньше.Чтобы исправить эту проблему, Python использует линеаризацию C3 (C3 superclass linearization), алгоритм, который всегда ищет метод сначала во всех дочерних классах, а затем уже в родительских.
Пример вывода MRO (Method Resolution Order):
In : Child.__mro__
Out:
(__main__.Child,
__main__.Parent1,
__main__.Parent2,
__main__.GrandParent,
object)
👉@BookPython
>>Click here to continue<<