2010-03-10 12 views
36

Supongamos que tengo una clase Base y una clase Child que hereda de Base. ¿Cuál es la forma correcta de llamar al constructor de la clase base de una clase secundaria en Python? ¿Uso super?¿Cómo llamar correctamente a los métodos de clase base (y al constructor) de clases heredadas en Python?

Aquí es un ejemplo de lo que tengo hasta ahora:

class Base(object): 
    def __init__(self, value): 
     self.value = value 
    ... 

class Child(Base): 
    def __init__(self, something_else): 
     super(Child, self).__init__(value=20) 
     self.something_else = something_else 
    ... 

Es esto correcto?

Gracias, Boda Cydo.

+4

Ignacio, he comprobado, pero hay otras maneras, por ejemplo, en 'Child', lo que podía hacer' def __init __ (self, something_else): Base .__ init __ (value = 20) 'y no tengo idea de si puedo hacer eso o no ... Por lo tanto, pedí saber cómo hacerlo de manera absolutamente correcta y de una manera moderna en Python. – bodacydo

Respuesta

39

Eso es correcto. Tenga en cuenta que también se puede llamar al método __init__ directamente en la clase Base, así:

class Child(Base): 
    def __init__(self, something_else): 
     Base.__init__(self, value = 20) 
     self.something_else = something_else 

Esa es la forma general lo hago. Pero está desaconsejado, porque no se comporta muy bien en presencia de herencia múltiple. Por supuesto, la herencia múltiple tiene todo tipo de efectos extraños propios, por lo que lo evito como la peste.

En general, si las clases que está heredando usan super, también es necesario.

+0

Gracias por describir ambos métodos. No estaba seguro del 'Base .__ init__'. – bodacydo

+0

¿Puedes agregar otro argumento que no sea "valor" al ejemplo? ¿Importa el orden? ¿Qué pasa si el valor está siendo asignado al valor? – ragerdl

11

Sí, eso es correcto. Si usted quiere ser capaz de pasar a la clase valueChild que podría hacerlo de esta manera

class Child(Base): 
    def __init__(self, value, something_else): 
     super(Child, self).__init__(value) 
     self.something_else = something_else 
    ... 
+0

¡Gracias por ilustrar cómo pasarle valor a Niño y luego este valor a Base! – bodacydo

+0

También debe asegurarse de que todas las superclases de Child puedan aceptar ese valor y transmitirlo, ya que, en general, no puede estar seguro de que se llame a Base. –

18

Si está utilizando Python 3.1, super es nuevo y mejorado. Calcula los argumentos de clase e instancia para usted. Por lo que debe llamar súper sin argumentos:

class Child(Base): 
    def __init__(self, value, something_else): 
     super().__init__(value) 
     self.something_else = something_else 
    ... 
Cuestiones relacionadas