Разрешение конфликтов методов при множественном наследовании в ООП в Python
Так как один класс может наследовать несколько родителей, то нас может поджидать проблема, возникающая тогда, когда два родителя имеют одноименные методы.
В Python при обычном вызове сработает только один из них. Побеждает тот родитель, который стоит левее в скобках при объявлении класса. Как это проверить - посмотрим на практике.
Пусть у нас есть две примеси с одинаковым
методом method:
class Mixin1:
def method(self):
return 1
class Mixin2:
def method(self):
return 2
Пусть у нас также есть класс Test,
наследующий обе примеси. Порядок в скобках
решает, какой method вызовется
через объект:
class Test(Mixin1, Mixin2):
pass
test = Test()
print(test.method()) # выведет 1
Поменяем местами родителей в объявлении
класса - левее в скобках будет
Mixin2, поэтому вызовется его
метод:
class Test(Mixin2, Mixin1):
pass
test = Test()
print(test.method()) # выведет 2
Если нужны оба варианта одного имени, в Python нет отдельного оператора выбора, как в PHP. Второй метод можно вызвать явно через имя класса-примеси:
class Test(Mixin1, Mixin2):
def both(self):
return Mixin1.method(self) + Mixin2.method(self)
test = Test()
print(test.both()) # выведет 3
Сделайте 3 класса-примеси с названиями
Mixin1, Mixin2 и Mixin3.
Пусть в первой примеси будет метод
method, возвращающий 1,
во второй - одноименный метод, возвращающий
2, а в третьей - одноименный метод,
возвращающий 3.
Сделайте класс Test, наследующий
все три созданные нами примеси. Сделайте в
этом классе метод get_sum, возвращающий
сумму результатов одноименных методов
всех трех примесей (вызовите каждый метод
через имя своего класса).