El constructor de herencia múltiple de Python no se llama cuando se usa super ()

Considere el siguiente código:

class A(object): def __init__(self): pass class B(object): def __init__(self): self.something = 'blue' def get_something(self): return self.something class C(A,B): def __init__(self): super().__init__() print(self.get_something()) 

y luego hacer:

 c = C() 

lo que resulta en algo como esto:

 AttributeError: 'C' object has no attribute 'something' 

Supongo que esto sucede debido a que el constructor de B no se llama cuando se usa super (). ¿Hay alguna manera de lograr el comportamiento correcto con Python 3?

Las superclases deberían usar super si sus subclases lo hacen. Si agrega la línea super().__init__() en A y B, su ejemplo debería funcionar nuevamente.

Verifique el orden de resolución del método de C:

 >>> C.mro() [__main__.C, __main__.A, __main__.B, builtins.object] 

Este artículo debería aclarar las cosas.

Como otros han mencionado, el orden de resolución del método es clave aquí. Si desea llamar a varios constructores de superclase, entonces tendrá que llamarlos directamente.

 class A(object): def __init__(self): pass class B(object): def __init__(self): self.something = 'blue' def get_something(self): return self.something class C(A,B): def __init__(self): A.__init__(self) B.__init__(self) print(self.get_something())