Parliamo di qualcosa che sembra piuttosto complicato.
Si chiama m r o o Method Resolution Order.
Cosa significa?
Faremo un esempio qui per te.
Diciamo che abbiamo una classe di A, la classe di B che eredita dalla classe di A non fa assolutamente nulla.
E poi abbiamo anche classi che ereditano di nuovo da A e poi infine una classe D, quindi eredita da
B e C.
Quindi abbiamo due classi che non fanno assolutamente nulla, quindi una classe e classi che hanno lo stesso
attributo dell'oggetto di classe.
E in realtà ho disegnato come si presenta questa relazione.
Vedete che D ha ereditarietà multipla da B e C e B e C ereditano da A.
E mi sbaglio o l'ordine di risoluzione del metodo è una regola che Python segue per determinare quando si esegue un metodo che si
desidera eseguire, quando si ha una struttura di ereditarietà così complicata e Maroš è una regola che
dice, ehi, fai questo, fai questo e poi Fai quello.
E questo è il metodo che dovresti eseguire.
Lascia che ti mostri cosa intendo.
Diciamo che volevo stampare d punto num.
Cosa pensi che accadrà qui?
Lascia che lo tolga di mezzo o lo commento.
Se eseguo questo, puoi indovinare cosa succederà?
Se clicco, corro.
ne prendo uno.
È quello che ti aspettavi?
Diamo un'occhiata a questo, D eredita da B e C.
E poi quelli ereditano da me, quindi ne otteniamo uno, perché il midollo, l'ordine di risoluzione del metodo è
che non va D, B, A, invece va D, b, c, a.
Hmmm, pensiamoci un po' di più, MRO sta semplicemente dicendo qual è il primo in linea
se le cose sono comuni tra classi, metodi o variabili o attributi, cosa dovrei scegliere?
E in realtà c'è un buon modo per verificarlo se eseguo MRO e poi lo eseguo in questo modo.
Ron.
Guarda questo, questo è l'ordine o l'MRO di questa classe, dice, ehi, controllerò prima se
chiami, diciamo dot net o dot.
No, prima controllerò il punto principale.
Quindi vado a controllare questa classe.
Quindi controllerò Main Dot be.
Quindi controllerò B e poi controllerò C.
E poi vado a controllare a.
E infine, controllerò di nuovo l'oggetto della classe base.
L'abbiamo già visto.
È la classe base da cui ereditano tutti gli oggetti in Python.
Quindi è questo l'ordine che controlla?
No.
Se passiamo tutti questi.
E clicco su Esegui.
ne prenderò un altro.
D non ha alcun attributo, no, perché ha attraversato tutto questo percorso, ha anche controllato l'oggetto base e non ne ha mai
trovato nessuno.
Se ho fatto qualcosa come s t r.
Se clicco, corro.
Funziona perché passa attraverso la catena di ereditarietà e poi arriva all'oggetto base e l'oggetto
base ha effettivamente questo, quindi non si erode.
E sì, puoi usare la stringa Dundar.
Ora, ho trovato un ottimo esempio qui per mostrarti perché le eredità possono essere fonte di
confusione e perché cose come MRO potresti voler evitare o almeno essere consapevole.
Quindi copiamo questo codice.
E rimuoviamo tutto questo.
E faremo un piccolo gioco.
Ora, questa sintassi.
Assomiglia a questo, quindi questo è il modello di ereditarietà di ciò che abbiamo appena creato sembra piuttosto confuso, non è vero?
Quindi se li facciamo qui.
E abbiamo controllato l'ordine di risoluzione MRO o metodo di un.
Quale pensi che l'ordine verrà messo in pausa il video qui e prova a indovinare quale sarà l'ordine?
Redi.
Facciamoli, Dot Amaro.
E comunque, un altro modo per farlo è usare il Dundar Amaro e stamparlo.
Va bene, controlliamo questo.
Quindi la prima cosa che abbiamo è M. Va bene, controlliamo lui e poi controlliamo B, controlliamo B, va bene.
E poi controlliamo A, quindi controlliamo qui e poi controlliamo X X qui, poi Y.
Quindi Z, quindi l'oggetto classe.
È per questo che hai indovinato diamo un'occhiata al codice.
Perché questo ordine?
Bene, l'ordine è dovuto al modo in cui stiamo passando i parametri, vedi B viene passato prima di A e
C.
Quindi questo significa che l'ordine di MRO sarà B, quindi A.
Ma aspetta, dopo BNA, cos'era quello?
Bene, dopo B e A, abbiamo la Classe X, perché X è venuto prima di Z?
Quindi, invece di andare a Z, rendiamolo un po' più grande, invece di andare a quello che avremmo
pensato fosse Z.
Va a X, poi Y, Lindsey, poi l'oggetto.
Questo è dovuto all'algoritmo che usano per fare MRO, che si chiama profondità per una ricerca.
Ora, questo va oltre lo scopo del corso, ma come puoi vedere, è un po' confuso.
E di fatto, Python ha effettivamente cambiato le regole MRO rispetto a quelle che avevamo precedentemente nelle versioni più giovani
di Python.
Quindi questa è un'altra di quelle cose che sono state aggiornate.
Ma il motivo per cui ti sto mostrando questo è perché non verrai mai sottoposto a test su quella roba.
Se stai scrivendo codice in cui l'ereditarietà è simile a questa, sostengo che stai scrivendo codice errato perché
è eccessivamente complicato, non abbiamo nemmeno scritto alcun codice effettivamente all'interno di queste classi ed
è già confuso.
Quindi MRO è un modo per definire quale ordine erediterà e puoi sempre usare la funzione MRO o Dundar
per verificarlo, ma il motivo per cui l'ho portato qui non è solo cercare di confonderti.
Il motivo è che esiste.
Tuttavia, non dovresti strutturare il tuo codice in questo modo.
Ciò non significa che ciò non avvenga in natura.
Sì, lo fa, ma almeno hai un modo per controllare e magari eseguire il debug del tuo codice quando vedi un
problema come questo.
Lascio una risorsa per te sull'MRO se sei davvero curioso e vuoi davvero capire come funziona
questo algoritmo e come viene effettivamente determinato questo ordine.
Ma il punto chiave è che questo è il modo in cui Python lavora per determinare, ehi, quando
chiami un metodo o un attributo.
È così che cercherò la gerarchia delle eredità, va bene, se ti fa male il cervello.
Non preoccuparti.
Così il mio.
Prenditi una pausa e ci vediamo nel prossimo video di.