Как Python находит свойства и методы: продолжение
Давайте посмотрим на пример в редакторе.
Класс Sub
наследует признаки от двух суперклассов, Left
и Right
(эти имена имеют смысл).
Нет сомнений, что переменная класса varRight
происходит из класса Right
, а varLeft
происходит от Left
соответственно.
Это понятно. Но откуда взялся var
? Можно ли это угадать? Та же проблема встречается с методом fun()
- будет ли он вызываться из Left
или из Right
? Давайте запустим программу - ее вывод:
L LL RR Left
output
Это доказывает, что оба неясных случая имеют решение внутри класса Left
. Достаточно ли этого, чтобы сформулировать общее правило? Да, это так.
Можно сказать, что Python ищет компоненты объекта в следующем порядке:
- внутри самого объекта;
- в его суперклассах, снизу вверх;
- если в конкретном пути наследования находится несколько классов, Python сканирует их слева направо.
Вам нужно что-нибудь еще? Просто внесите небольшую поправку в код - замените: class Sub (Left, Right):
на: class Sub (Right, Left):
, затем снова запустите программу, и посмотрите, что получится.
Что Вы видите сейчас? Вы должны увидеть:
R LL RR Right
output
Вы видите то же самое или что-то другое?
Code
class Left:var = "L"
var_left = "LL"
def fun(self):
return "Left"
class Right:
var = "R"
var_right = "RR"
def fun(self):
return "Right"
class Sub(Left, Right):
pass
obj = Sub()
print(obj.var, obj.var_left, obj.var_right, obj.fun())