Estaba leyendo 'Sumérgete en Python' y en el capítulo sobre clases da este ejemplo:
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename
Luego, el autor dice que si desea anular el __init__
método, debe llamar explícitamente al padre __init__
con los parámetros correctos.
- ¿Qué pasa si esa
FileInfo
clase tenía más de una clase de antepasados?- ¿Tengo que llamar explícitamente a todos los
__init__
métodos de las clases ancestrales ?
- ¿Tengo que llamar explícitamente a todos los
- Además, ¿tengo que hacer esto con algún otro método que quiera anular?
python
overriding
superclass
liewl
fuente
fuente
Respuestas:
El libro está un poco anticuado con respecto a las llamadas de subclase-superclase. También está un poco anticuado con respecto a la subclase de clases incorporadas.
Se ve así hoy en día:
Tenga en cuenta lo siguiente:
Podemos subclase directamente incorporado en las clases, como
dict
,list
,tuple
, etc.La
super
función maneja el rastreo de las superclases de esta clase y llama a las funciones de manera apropiada.fuente
En cada clase de la que necesita heredar, puede ejecutar un bucle de cada clase que necesita iniciarse al iniciar la clase secundaria ... un ejemplo que puede copiarse podría entenderse mejor ...
fuente
Child.__init__
sea necesario el bucle for . Cuando lo elimino del ejemplo, mi hijo todavía imprime "Abuela". ¿El abuelo init no es manejado por laParent
clase?Realmente no tiene que llamar a los
__init__
métodos de la (s) clase (s) base (s), pero generalmente desea hacerlo porque las clases base harán algunas inicializaciones importantes allí que son necesarias para que el resto de los métodos de clases funcionen.Para otros métodos, depende de tus intenciones. Si solo desea agregar algo al comportamiento de las clases base, deberá llamar al método de las clases base adicionalmente a su propio código. Si desea cambiar fundamentalmente el comportamiento, es posible que no llame al método de la clase base e implemente toda la funcionalidad directamente en la clase derivada.
fuente
Si la clase FileInfo tiene más de una clase ancestral, definitivamente debe llamar a todas sus funciones __init __ (). También debe hacer lo mismo para la función __del __ (), que es un destructor.
fuente
Sí, debe llamar
__init__
para cada clase de padres. Lo mismo ocurre con las funciones, si está anulando una función que existe en ambos padres.fuente