Вызов метода родителя при множественном наследовании в ООП в Python
При множественном наследовании в потомке
часто нужно вызвать реализацию метода
из одного из родителей. Для этого
используют super().
Важный момент: super() идет не
«в один жестко заданный класс», а по
цепочке __mro__. Следующим после
текущего класса в этой цепочке будет
тот родитель, чей код выполнится при
вызове super().method().
Давайте посмотрим на примере. Пусть есть общий предок и два промежуточных класса:
class Root:
def show(self):
return 'root'
class Left(Root):
def show(self):
return 'left-' + super().show()
class Right(Root):
def show(self):
return 'right-' + super().show()
class Child(Left, Right):
def show(self):
return 'child-' + super().show()
Создадим объект и вызовем метод:
obj = Child()
print(obj.show())
Цепочка super() пройдет по
Child.__mro__: сначала метод
Left, затем Right,
затем Root. Именно поэтому
порядок родителей в скобках важен не
только при конфликте имен, но и при
совместной работе через super().
print(Child.__mro__)