Menu
Coddy logo textTech

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):
    pass

Controlla 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 A

Python 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 B

Ora 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.

challenge icon

Sfida

Medio

In questa sfida implementerai una gerarchia di classi.

Dovrai modificare questi file:

  • device.py: implementa la classe base Device
  • screen.py: implementa la classe Screen che eredita da Device
  • computer.py: implementa la classe Computer che eredita da Device
  • laptop.py: implementa la classe Laptop con ereditarietà multipla
  • driver.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
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Python online