Pregunta

Al derivar de un tipo Builtin, así como de alguna otra clase, parece que el constructor del tipo Builtin no llama al constructor de súper clase. Esto da como resultado que los métodos __init__ no se soliciten para los tipos que vienen después de la construcción en el MRO.

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 se llama. Cuando B se define como class B(A, list) En cambio, cambiar el orden de herencia, funciona según lo previsto (es decir, se llama a .__ init__).

Esta dependencia muy sutil de la orden de herencia parece bastante poco pitónica, ¿está destinada de esta manera? También significa que nunca debes derivar de los tipos integrados en jerarquías de clase complejas, porque no puedes saber dónde termina el Builtin en el MRO cuando alguien más deriva de tus clases (horror de mantenimiento). ¿Me estoy perdiendo de algo?

Información adicional: Python versión 3.1

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top