En la respuesta de Anon:
"Si necesita hacer algo de super __init__
además de lo que se está haciendo en la clase actual __init__
, debe llamarlo usted mismo, ya que eso no sucederá automáticamente"
Es increíble: está redactando exactamente lo contrario del principio de herencia.
No es que "algo de super __init__
(...) no suceda automáticamente" , es que sucedería automáticamente, pero no sucede porque la clase base ' __init__
es anulada por la definición de la clase derivada__init__
Entonces, ¿POR QUÉ definir una "clase derivada" __init__
, ya que anula lo que se pretende cuando alguien recurre a la herencia?
Es porque uno necesita definir algo que NO se hace en la clase base ' __init__
, y la única posibilidad de obtener eso es poner su ejecución en una __init__
función de clase derivada' .
En otras palabras, uno necesita algo en la clase base ' __init__
además de lo que se haría automáticamente en la clase base' __init__
si este último no fuera anulado.
NO al contrario.
Entonces, el problema es que las instrucciones deseadas presentes en la clase base ' __init__
ya no se activan en el momento de la instanciación. Para compensar esta inactivación, se requiere algo especial: llamar explícitamente a la clase base ' __init__
, para MANTENER , NO AGREGAR, la inicialización realizada por la clase base' __init__
. Eso es exactamente lo que se dice en el documento oficial:
De hecho, un método de anulación en una clase derivada puede querer extender en lugar de simplemente reemplazar el método de la clase base del mismo nombre. Hay una manera simple de llamar directamente al método de la clase base: simplemente llame a BaseClassName.methodname (self, argumentos).
http://docs.python.org/tutorial/classes.html#inheritance
Esa es toda la historia:
cuando el objetivo es MANTENER la inicialización realizada por la clase base, que es pura herencia, no se necesita nada especial, solo se debe evitar definir una __init__
función en la clase derivada
cuando el objetivo es REEMPLAZAR la inicialización realizada por la clase base, __init__
debe definirse en la clase derivada
cuando el objetivo es AGREGAR procesos a la inicialización realizada por la clase base, se __init__
debe definir una clase derivada que comprenda una llamada explícita a la clase base__init__
Lo que siento asombroso en la publicación de Anon no es solo que él exprese lo contrario de la teoría de la herencia, sino que ha habido 5 tipos pasando por alto sin votar, y además no ha habido nadie que reaccione en 2 años en un hilo cuyo tema interesante debe leerse con relativa frecuencia.
object
fue un error tipográfico. Pero ahora ni siquiera tiene elsuper
título de su pregunta se refiere.