Al derivar de un tipo incorporado así como de alguna otra clase, parece que el constructor del tipo incorporado no llama al constructor de la superclase. Esto da como resultado que los métodos __init__ no se invoquen para los tipos que vienen después del built-in en el MRO.Python 3 tipos incorporados __init__ no llama a super() .__ init__?
Ejemplo:
class A:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print("A().__init__()")
class B(list, A):
def __init__(self, *args, **kwargs):
print("B().__init__() start")
super().__init__(*args, **kwargs)
print("B().__init__() end")
if __name__ == '__main__':
b = B()
En esta muestra, A init__ .__ nunca es llamado. Cuando B se define como class B(A, list)
en su lugar, cambiando el orden de herencia, funciona según lo previsto (es decir, se llama a .__ init__).
Esta muy sutil dependencia del orden de herencia parece bastante antiponética, ¿se pretende de esta manera? También significa que nunca debe derivarse de tipos incorporados en jerarquías de clases complejas, porque no puede saber dónde termina el edificio en el MRO cuando alguien más deriva de sus clases (horror de mantenimiento). ¿Me estoy perdiendo de algo?
Información adicional: Python versión 3.1
Python nunca ha tenido invocación automática de la superclase '__init__' métodos – Marcin
¿Cómo sería llamar' Un .__ init__' con? 'list .__ init__' toma un argumento y arroja un error si obtiene más. Incluso si aceptara otros argumentos arbitrarios, cortaría el primero, por lo que lo que A veía dependería del orden de herencia. –
Una pregunta similar: http: // stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance Con la interpretación de Guido de la respuesta a esa pregunta: http://python-history.blogspot.com/2010/06/method- resolution-order.html – aganders3