Мне не нравится подход, но вы можете использовать:
class Z(X, Y):
def __init__(self, x, y, z):
super().__init__(x)
super(X, self).__init__(y)
self.z = z
И удалить super()
вызовы в X
и Y
.
Другой подход заключается в использовании kwargs или отсутствии аргументов в __init__
, чтобы вы могли сохранить одну и ту же сигнатуру инициализации во всех классах. После этого вы можете использовать super()
и Порядок разрешения методов (MRO) для вызова функций инициализации. Стек вызовов будет выглядеть так:
Z(x=.., y=.., z=..)
звонки Z.__init__
Z.__init__
получает z
кварг и звонит super().__init__(**kwargs)
, что составляет X.__init__
X.__init__
получает x
kwarg и звонит super().__init__(**kwargs)
, что составляет Y.__init__
Y.__init__
получает y
kwarg и звонит super().__init__()
, что object.__init__
Примечание: super()
без аргументов работает только в Python 3.
Последний подход, который я могу придумать, - это (!) Не использовать super, а просто вызывать X.__init__(self, x)
и Y.__init__(self, y)
внутри Z
напрямую.