Nel libro Python in a Nutshell (2a edizione) c'è un esempio che utilizza
classi vecchio stile per dimostrare come i metodi vengono risolti in modo classico e risoluzione
come è diverso con il nuovo ordine.Method Resolution Order (MRO) nelle classi di nuovo stile?
Ho provato lo stesso esempio riscrivendo l'esempio in un nuovo stile ma il risultato non è diverso da quello ottenuto con le classi di vecchio stile. La versione python che sto usando per eseguire l'esempio è 2.5.2. Di seguito è l'esempio:
class Base1(object):
def amethod(self): print "Base1"
class Base2(Base1):
pass
class Base3(object):
def amethod(self): print "Base3"
class Derived(Base2,Base3):
pass
instance = Derived()
instance.amethod()
print Derived.__mro__
La chiamata instance.amethod()
stampe Base1
, ma come per la mia comprensione della MRO con il nuovo stile di classi dell'uscita avrebbe dovuto essere Base3
. Le chiamate Derived.__mro__
stampe:
(<class '__main__.Derived'>, <class '__main__.Base2'>, <class '__main__.Base1'>, <class '__main__.Base3'>, <type 'object'>)
io non sono sicuro se la mia comprensione di MRO con nuovi stili di classi non è corretto o che sto facendo un errore stupido che io non sono in grado di rilevare. Per favore aiutami a capire meglio l'MRO.
"[la classe degli antenati] A [è] costretto a venire in ordine di risoluzione solo una volta e dopo tutte le sue sottoclassi, così che le sostituzioni (cioè l'override di C del membro x) funzionano effettivamente in modo ragionevole." - * Epifania! * Grazie a questa frase, posso fare di nuovo MRO nella mia testa. \ o/Grazie mille. – Esteis