method python class inheritance constructor superclass

python - method - ¿Cómo invocar al super constructor?



super en python 3 (5)

Con las clases antiguas 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)

class A: def __init__(self): print "world" class B(A): def __init__(self): print "hello" B() 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.


En línea con las otras respuestas, hay varias formas de llamar a los métodos de superclase (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(<containing classname>, self) según los documentos .


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 única, 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á here (aunque no estoy respaldando las opiniones de ese artículo).


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.


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()