Entender los métodos super() de Python con __init__()

Estoy tratando de entender el uso de super(). Por lo que parece, ambas clases hijas pueden ser creadas, sin problemas.

Tengo curiosidad por saber la diferencia real entre las siguientes 2 clases hijas.

class Base(object):
    def __init__(self):
        print "Base created"

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

class ChildB(Base):
    def __init__(self):
        super(ChildB, self).__init__()

ChildA() 
ChildB()
Solución

super() le permite evitar referirse a la clase base explícitamente, lo que puede ser agradable. Pero la principal ventaja viene con la herencia múltiple, donde pueden ocurrir todo tipo de cosas divertidas. Consulta la documentación estándar sobre super si aún no lo has hecho.

Tenga en cuenta que la sintaxis cambió en Python 3.0: puede decir simplemente super().__init__() en lugar de super(ChildB, self).__init__() lo que, en mi opinión, es bastante más agradable. La documentación estándar también hace referencia a una guía de uso de super() que es bastante explicativa.

Comentarios (5)

Sólo un aviso... con Python 2.7, y creo que desde que se introdujo super() en la versión 2.2, sólo puedes llamar a super() si uno de los padres hereda de una clase que eventualmente hereda de object (clases de estilo nuevo).

Personalmente, en cuanto al código de python 2.7, voy a seguir usando BaseClassName.__init__(self, args) hasta que realmente consiga la ventaja de usar super().

Comentarios (2)

En realidad, no lo hay. super() busca la siguiente clase en el MRO (orden de resolución de métodos, al que se accede con cls.__mro__) para llamar a los métodos. Simplemente llamando a la base __init__ llama a la base __init__. Como sucede, el MRO tiene exactamente un elemento - la base. Así que realmente estás haciendo exactamente lo mismo, pero de una manera más agradable con super() (particularmente si te metes en la herencia múltiple más adelante).

Comentarios (6)