Инициализаторы подклассов не имеют совместимых подписей, что является ключом для правильных совместных супер-вызовов.
Простое решение здесь - сделать эти сигнатуры совместимыми - канонически, добавив поддержку varargs и произвольных аргументов ключевых слов по всей цепочке, ie:
# NB: Python3 required, won't work in Py2
class A:
def __init__(self, a, *args, **kwargs):
self.a = a
class B(A):
def __init__(self, a, b, *args, **kwargs):
super().__init__(a, *args, **kwargs)
self.b = b
class C(A):
def __init__(self, a, c, *args, **kwargs):
super().__init__(a, *args, **kwargs)
self.c = c
class D(B, C):
def __init__(self, a, b, c, d, *args, **kwargs):
super().__init__(a, b=b, c=c, *args, **kwargs)
self.d = d
d = D(1, 2, 3, 4)
Это, конечно, не решить каждую возможную проблему с множественным наследованием и совместными вызовами super
, но MI является хитрым, и есть ограничения на то, что возможно в любом случае.