Ordine di risoluzione dei metodi
Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 21 di 64.
L’ordine di risoluzione dei metodi (MRO) è la sequenza che Python usa per cercare i metodi quando più classi hanno lo stesso nome di metodo.
Ecco un esempio con più classi che hanno lo stesso metodo:
class A:
def method(self):
return "Method from A"
class B:
def method(self):
return "Method from B"
class C(A, B):
passControlla l’MRO usando __mro__:
print(C.__mro__)Output:
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)L'attributo __mro__ è una tupla che contiene tutte le classi nell'ordine di risoluzione. Il primo elemento (__mro__[0]) è sempre la classe stessa (C), seguito dalle classi genitrici da sinistra a destra (A, poi B) e infine dalla classe integrata object.
Crea un oggetto e chiama il metodo:
c = C()
print(c.method())Output:
Method from APython ha trovato per prima il metodo nella classe A (all’indice 1 nel MRO), quindi ha usato quello.
Modifica l'ordine di ereditarietà per vedere la differenza:
class D(B, A): # Ora B viene prima di A
pass
print(D.__mro__)
d = D()
print(d.method())Output:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Method from BOra Python trova per prima il metodo di B perché B viene prima di A nell'elenco di ereditarietà. Puoi accedere a classi specifiche nell'MRO usando l'indicizzazione: D.__mro__[0] è D stessa, D.__mro__[1] è B e D.__mro__[2] è A.
Puoi anche usare il metodo mro():
print(C.mro())Sebbene mro() e __mro__ forniscano la stessa sequenza di classi, differiscono per tipo: __mro__ restituisce una tupla, mentre mro() restituisce una lista.
Punto chiave: Python cerca i metodi nell’ordine MRO: prima la classe stessa (indice 0), poi le classi genitore da sinistra a destra, nell’ordine in cui sono elencate nella definizione della classe (indici 1, 2, ecc.). Viene usato il primo metodo trovato.
Sfida
MedioIn questa sfida implementerai una gerarchia di classi.
Dovrai modificare questi file:
device.py: implementa la classe baseDevicescreen.py: implementa la classeScreenche eredita daDevicecomputer.py: implementa la classeComputerche eredita daDevicelaptop.py: implementa la classeLaptopcon ereditarietà multipladriver.py- implementa i casi di test che verificheranno il corretto funzionamento della tua implementazione
Ogni file contiene commenti dettagliati TODO che ti guideranno passo dopo passo nell'implementazione.
Provalo tu
# TODO: Importa tutte le classi necessarie
# from device import Device
# from screen import Screen
# from computer import Computer
# from laptop import Laptop
def explain_mro(class_name):
# TODO: Stampa l'MRO (ordine di risoluzione dei metodi) per la classe specificata
# TODO: Formato: "MRO for [class name]:" (nota: NESSUNO spazio dopo i due punti)
# TODO: Usa class_name.__name__ per ottenere il nome della classe
# TODO: Usa class_name.__mro__ per ottenere la tupla MRO
# TODO: Stampa il nome di ogni classe nell'MRO su una riga separata
# TODO: Crea un'istanza della classe
# TODO: Chiama power_on() sull'istanza e memorizza il risultato
# TODO: Stampa: "Power on result: [result]"
# TODO: Stampa una riga vuota per migliorare la leggibilità
pass
# Metti alla prova il tuo codice
# TODO: Chiama explain_mro() con ciascuna classe: Device, Screen, Computer e Laptop
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP
File esterniIntroduzione a OOPClassi vs. oggettiIl parametro selfMetodiAttributiMetodo costruttore (__init__)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa funzione super()Sovrascrittura dei metodiEreditarietà multiplaOrdine di risoluzione dei metodiRiepilogo - Gerarchia dei dipendenti7Metodi speciali
Introduzione ai metodi magiciSovraccarico degli operatoriMetodi magici dei contenitoriRiepilogo - Lista personalizzata10Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello ObserverModello Strategy2Decoratori
Introduzione ai decoratoriDecoratore di proprietàDecoratore di metodo staticoDecoratore di metodo di classe5Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàMixinMetodi statici e di classeDecorator di classeContext manager11Pattern di progettazione - Parte 2
Pattern dei comandiPattern adattatorePattern decoratorePattern metodo templatePattern statoPattern composito3Proprietà delle classi
Variabili di istanza e di classeDecorator delle proprietàAttributi privatiRiepilogo - Gestore di conti bancari6Incapsulamento
Membri pubblici, protetti e privatiModificatori di accessoOccultamento delle informazioniDecorator delle proprietà: avanzatiRipasso - Sistema di registri degli studenti12Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreTest e integrazioneEsercitati da solo: Compilatore Python online