¿Cómo invocar al super constructor?

class A: def __init__(self): print("world") class B(A): def __init__(self): print("hello") B() # output: hello 

En todos los demás lenguajes que he trabajado con el súper constructor se invoca implícitamente. ¿Cómo se invoca en Python? Yo esperaría super(self) pero esto no funciona.

super() devuelve un objeto similar a un padre en clases de nuevo estilo :

 class A(object): def __init__(self): print "world" class B(A): def __init__(self): print "hello" super(B, self).__init__() B() 

En línea con las otras respuestas, hay varias formas de llamar a los métodos de la super clase (incluido el constructor), sin embargo, en Python-3.x el proceso se ha simplificado:

Python-2.x

 class A(object): def __init__(self): print "world" class B(A): def __init__(self): print "hello" super(B, self).__init__() 

Python-3.x

 class A(object): def __init__(self): print("world") class B(A): def __init__(self): print("hello") super().__init__() 

super() ahora es equivalente a super(, self) según los documentos .

Con las clases de estilo antiguo de Python 2.x sería esto:

 class A: def __init__(self): print "world" class B(A): def __init__(self): print "hello" A.__init__(self) 

Una forma es llamar al constructor de A y pasarse a self como un argumento, así:

 class B(A): def __init__(self): A.__init__(self) print "hello" 

La ventaja de este estilo es que es muy claro. Se llama constructor de a. La desventaja es que no maneja muy bien la herencia en forma de diamante, ya que puede terminar llamando dos veces al constructor de la clase base compartida.

Otra forma es usar super (), como han demostrado otros. Para la herencia simple, básicamente hace lo mismo que permitirle llamar al constructor del padre.

Sin embargo, super () es un poco más complicado bajo el capó y, a veces, puede ser contraintuitivo en situaciones de herencia múltiple. En el lado positivo, se puede usar super () para manejar la herencia en forma de diamante. Si quieres saber qué es lo que hace super (), la mejor explicación que he encontrado sobre cómo funciona super () está aquí (aunque no estoy necesariamente respaldando las opiniones de ese artículo).

Respuesta corta

 super(DerivedClass, self).__init__() 

Respuesta larga

¿Qué hace super() ?

Toma el nombre de clase especificado, encuentra sus clases básicas (Python permite herencia múltiple) y busca el método ( __init__ en este caso) en cada una de ellas de izquierda a derecha. Tan pronto como encuentre el método disponible, lo llamará y finalizará la búsqueda.

¿Cómo llamo a init de todas las clases base?

Lo anterior funciona si solo tienes una clase base. Pero Python permite la herencia múltiple y es posible que desee asegurarse de que todas las clases base se inicialicen correctamente. Para hacer eso, debes tener cada clase base llamada init:

 class Base1: def __init__(): super(Base1, self).__init__() class Base2: def __init__(): super(Base2, self).__init__() class Derived(Base1, Base2): def __init__(): super(Derived, self).__init__() 

¿Qué pasa si me olvido de llamar a init para super?

El __init__ para la clase base no se llama. No hay llamadas implícitas de constructores como en C ++ y Java.

Utilizo la siguiente fórmula que amplía las respuestas anteriores:

 class A(object): def __init__(self): print "world" class B(A): def __init__(self): print "hello" super(self.__class__, self).__init__() B() 

De esta manera, no tiene que repetir el nombre de la clase en la llamada a super . Puede ser útil si está codificando una gran cantidad de clases y desea que su código en los métodos del constructor sea independiente del nombre de la clase.