in primo luogo, vorrei citare un po 'un saggio da "esperti di programmazione Python" libro:miscelazione eccellenti e classici chiamate in Python
Nell'esempio seguente, una classe C che chiama le sue classi di base utilizzando il metodo __init__ Sarà fare in modo che la classe B venga chiamata due volte!
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
e, infine, ecco una spiegazione di ciò sta succedendo qui:
Questo accade a causa della .__ init __ (self) chiamata A, che è fatta con l'istanza C, rendendo super (A, self) .__ init __() chiama il costruttore di B. In altre parole, super deve essere utilizzato nell'intera gerarchia di classi. Il problema è che a volte una parte di questa gerarchia si trova nel codice di terze parti.
Non ho idea del perché "super(A, self).__init__()
chiama il costruttore di B". Per favore, spiega questo momento. Molte grazie.
grazie. una domanda - è vero che quando "super (A, self) .__ init __()" viene richiamato all'interno del costruttore di classe A, il suo argomento "self" è uguale alla nostra istanza C che abbiamo appena istanziato? – varnie
@varnie: sì. Puoi 'stampare super (A, self)' all'interno del metodo A __init __() 'per vedere che' self' è in effetti un'istanza 'C'. –