2012-05-02 20 views
16

Me desconcierta cómo no puedo encontrar una explicación clara de esto en cualquier lugar. ¿Por qué y cuándo necesita llamar al método de la clase base dentro del mismo método de la clase secundaria?Herencia de Python: ¿se invocan métodos de clase base dentro de la clase secundaria?

class Child(Base): 
    def __init__(self): 
     Base.__init__(self) 

    def somefunc(self): 
     Base.somefunc(self) 

Supongo que hará esto cuando no desee sobrescribir completamente el método en la clase base. ¿es eso realmente todo lo que hay que hacer?

Respuesta

2

Depende completamente de la clase y el método.

Si solo quiere hacer algo antes/después de ejecutar el método base o llamarlo con diferentes argumentos, obviamente llama al método base en el método de su subclase.

Si desea reemplazar todo el método, obviamente no lo llame.

+0

Como nota al margen, sin embargo, siempre debe llamar a la clase padre ''__init__'. – Amber

13

Normalmente, esto se hace cuando se desea ampliar la funcionalidad modificando, pero no reemplazando por completo el método de la clase base. defaultdict es un buen ejemplo de esto:

class DefaultDict(dict): 
    def __init__(self, default): 
     self.default = default 
     dict.__init__(self) 

    def __getitem__(self, key): 
     try: 
      return dict.__getitem__(self, key) 
     except KeyError: 
      result = self[key] = self.default() 
      return result 

Tenga en cuenta que la forma adecuada de hacerlo es use super instead of directly calling the base class. De la misma manera:

class BlahBlah(someObject, someOtherObject): 
    def __init__(self, *args, **kwargs): 
     #do custom stuff 
     super(BlahBlah, self).__init__(*args, **kwargs) # now call the parent class(es) 
+0

¿Qué tiene de bueno esta "super" función? – user1369281

+5

@ user1369281: Bueno, no siempre son geniales. Sin embargo, si los usa consistentemente, hacen que los árboles de herencia sean mucho más fáciles de trabajar. ¿Qué ocurre si, por ejemplo, quiero cambiar mi 'defaultdict' por un _ordered_ dict predeterminado? Si utilicé 'super()', lo único que tendría que cambiar en mi código sería la definición de la clase. Todos esos 'super' se refieren automáticamente a cualquier clase base de la que herede mi clase actual. Facilita la programación de caja negra. –

+0

Me gusta esto porque te recuerda (o enseña) que tu clase puede heredar múltiples clases. Entonces, si su clase padre es de una lib que no puede modificar y no hereda ningún objeto, simplemente puede agregar 'object' a su clase. – casey

Cuestiones relacionadas