primer lugar, vamos a citar un poco un ensayo del libro "Programación Avanzado Python":mezcla súper clásicos y llamadas en Python
En el siguiente ejemplo, una clase C que llama a sus clases base utilizando el método __init__ ¡ hará que la clase B se llame dos veces!
class A(object):
def __init__(self):
print "A"
super(A, self).__init__()
class B(object):
def __init__(self):
print "B"
super(B, self).__init__()
class C(A,B):
def __init__(self):
print "C"
A.__init__(self)
B.__init__(self)
print "MRO:", [x.__name__ for x in C.__mro__] #prints MRO: ['C', 'A', 'B', 'object']
C() #prints C A B B
y, por último, aquí es una explicación de lo que está pasando aquí:
Esto sucede debido a la __ (self) llamada A .__ init, que se hace con la instancia C, haciendo de esta manera que el constructor de B de super (A, self) .__ init __(). En otras palabras, super debe usarse en toda la jerarquía de clases. El problema es que a veces parte de esta jerarquía se encuentra en código de terceros.
no tengo idea de por qué "super(A, self).__init__()
llama al constructor de B". Por favor explique este momento. Muchas gracias.
gracias. una pregunta: ¿es cierto que cuando se invoca a "super (A, self) .__ init __()" dentro del constructor de clase A, su argumento "self" es igual a nuestra instancia C que acabamos de instanciar? – varnie
@varnie: sí. Puede 'imprimir super (A, self)' dentro del método '__init __()' de A para ver que 'self' es de hecho una instancia' C'. –