método multiple meaning herencia español __init__ python override superclass

meaning - herencia multiple python



Herencia y Anulación__init__ en python (5)

El libro está un poco anticuado con respecto a las llamadas de superclase de subclase. También está un poco anticuado con respecto a las clases incorporadas de subclase.

Se ve así hoy en día.

class FileInfo(dict): """store file metadata""" def __init__(self, filename=None): super( FileInfo, self ).__init__() self["name"] = filename

Tenga en cuenta lo siguiente.

  1. Podemos subclasificar directamente las clases incorporadas, como dict , list , tuple , etc.

  2. La función super maneja el rastreo de las superclases de esta clase y las funciones de llamada en ellos apropiadamente.

Estaba leyendo ''Dive Into 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

El autor dice que si desea anular el método __init__ , debe llamar explícitamente al padre __init__ con los parámetros correctos.

  1. ¿Qué pasa si esa clase FileInfo tiene más de una clase ancestro?
    • ¿Tengo que llamar explícitamente a todos los métodos __init__ de las clases __init__ ?
  2. Además, ¿tengo que hacer esto con cualquier otro método que quiera anular?

En cada clase que necesita heredar, puede ejecutar un ciclo de cada clase que necesita iniciarse al iniciarse la clase secundaria ... un ejemplo que puede copiarse podría entenderse mejor ...

class Female_Grandparent: def __init__(self): self.grandma_name = ''Grandma'' class Male_Grandparent: def __init__(self): self.grandpa_name = ''Grandpa'' class Parent(Female_Grandparent, Male_Grandparent): def __init__(self): Female_Grandparent.__init__(self) Male_Grandparent.__init__(self) self.parent_name = ''Parent Class'' class Child(Parent): def __init__(self): Parent.__init__(self) #---------------------------------------------------------------------------------------# for cls in Parent.__bases__: # This block grabs the classes of the child cls.__init__(self) # class (which is named ''Parent'' in this case), # and iterates through them, initiating each one. # The result is that each parent, of each child, # is automatically handled upon initiation of the # dependent class. WOOT WOOT! :D #---------------------------------------------------------------------------------------# g = Female_Grandparent() print g.grandma_name p = Parent() print p.grandma_name child = Child() print child.grandma_name


En realidad, no tiene que llamar a los métodos __init__ de la (s) clase (s) base, pero generalmente quiere hacerlo porque las clases base harán algunas inicializaciones importantes allí que son necesarias para que el resto de los métodos de clase funcionen.

Para otros métodos, depende de tus intenciones. Si solo quiere agregar algo al comportamiento de las clases base, querrá llamar al método de las clases base, además, 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.


Sí, debe llamar a __init__ para cada clase de padres. Lo mismo ocurre con las funciones, si está anulando una función que existe en ambos padres.


Si la clase FileInfo tiene más de una clase antecesora, entonces definitivamente debe llamar a todas sus funciones __init __ (). También debe hacer lo mismo para la función __del __ (), que es un destructor.