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()
2357
3
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 desuper(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.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 asuper()
si uno de los padres hereda de una clase que eventualmente hereda deobject
(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 usarsuper()
.En realidad, no lo hay.
super()
busca la siguiente clase en el MRO (orden de resolución de métodos, al que se accede concls.__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 consuper()
(particularmente si te metes en la herencia múltiple más adelante).