Это полностью зависит от того, Y
и Z
были разработаны работать совместно с множественным наследованием. Если они есть, то вы должны быть в состоянии использовать только super
:
class X(Y, Z):
def __init__(self):
super().__init__()
Когда я говорю, что Y
и Z
должны быть разработаны для совместной работы с множественным наследованием, я имею в виду, что они должны также вызвать супер в их __init__
методы:
class Y:
def __init__(self):
print('Y.__init__')
super().__init__()
class Z:
def __init__(self):
print('Z.__init__')
super().__init__()
они также должны иметь определенную стратегию для обработки различных аргументов, так как (в частности, конструктор) класса часто различаются, в которых ключевое слово аргументы, которые они принимают. На данный момент стоит прочитать Super considered super! и Super considered harmful, чтобы понять некоторые распространенные идиомы и подводные камни относительно супер.
Если вы не знаете, были ли Y
и Z
предназначены для совместного множественного наследования, то самым безопасным средством правовой защиты является то, что они не были.
Если классы не предназначены для работы с кооперативным множественным наследованием, то вам необходимо начать легко ступая (вы в опасных водах). Вы можете созвонимся __init__
индивидуально:
class X(Y, Z):
def __init__(self):
Y.__init__(self)
Z.__init__(self)
Но на самом деле это, вероятно, лучше не использовать множественное наследование и вместо того, чтобы выбрать другую парадигму (например, композиция).
Это Python 2 или 3? – DeepSpace
Я нахожусь на Python 3. – masnun
Это еще одна причина, почему множественное наследование - это плохо, так как вы можете спросить о лучших практиках в такой плохой практике? – Sergius