Ho letto la programmazione Python esperta che ha un esempio di ereditarietà multipla. L'autore del libro ha spiegato ma non l'ho capito, quindi mi piacerebbe avere un'altra visione.Un oggetto viene creato due volte in Python
L'esempio mostra che l'oggetto B
viene creato due volte!
Potrebbe per favore darmi una spiegazione intuitiva.
In [1]: class A(object):
...: def __init__(self):
...: print "A"
...: super(A, self).__init__()
In [2]: class B(object):
...: def __init__(self):
...: print "B"
...: super(B, self).__init__()
In [3]: class C(A,B):
...: def __init__(self):
...: print "C"
...: A.__init__(self)
...: B.__init__(self)
In [4]: print "MRO:", [x.__name__ for x in C.__mro__]
MRO: ['C', 'A', 'B', 'object']
In [5]: C()
C
A
B
B
Out[5]: <__main__.C at 0x3efceb8>
L'autore libro diceva:
Questo accade a causa della
A.__init__(self)
chiamata, che è fatta con l'istanza C, rendendo cosìsuper(A, self).__init__()
chiamataB
s' costruttore
L' punto da cui non ho avuto la sua idea è come la chiamata A.__init__(self)
farà super(A, self).__init__()
chiamare il costruttore B
Perché non utilizza 'super 'nel metodo init di C? –
Voglio solo capire come viene creato un oggetto in Python. – Bryan
Se pensate che la chiamata 'super' come' chiama il prossimo metodo nell'MRO ', piuttosto che' chiama il metodo della mia classe genitore ', allora questo comportamento dovrebbe avere più senso. In questo caso, il motivo per cui vedi B stampato due volte è perché super già ordina che l'init di B sia chiamato (da init di A), e quindi quando chiami esplicitamente B.init da C, ottieni una seconda chiamata. –