Introduzione ai Decoratori in Python per la Programmazione a Oggetti

by theArchitect
SHARE
Introduzione ai Decoratori in Python per la Programmazione a Oggetti
© Guida-HTML5.it

Introduzione

I decoratori in Python sono una funzionalità potente e flessibile che consente di modificare il comportamento delle funzioni o dei metodi senza modificarne il codice sorgente. Nella programmazione orientata agli oggetti (OOP), i decoratori possono essere utilizzati per arricchire le classi e i metodi, aggiungendo funzionalità come il logging, la convalida degli input, o la gestione delle autorizzazioni. In questo tutorial, esploreremo come utilizzare i decoratori in un contesto OOP, fornendo esempi pratici e spiegazioni dettagliate.

Codice completo

def log_method_call(method):
    """Decoratore per loggare le chiamate ai metodi."""
    def wrapper(self, *args, **kwargs):
        print(f"Chiamata al metodo: {method.__name__} con argomenti: {args} e kwarg: {kwargs}")
        return method(self, *args, **kwargs)
    return wrapper

class Persona:
    def __init__(self, nome, eta):
        self.nome = nome
        self.eta = eta

    @log_method_call
    def saluta(self):
        """Metodo per salutare."""
        return f"Ciao, sono {self.nome} e ho {self.eta} anni."

    @log_method_call
    def invecchia(self, anni):
        """Metodo per invecchiare la persona."""
        self.eta += anni
        return f"{self.nome} ora ha {self.eta} anni."

# Utilizzo della classe
persona = Persona("Marco", 30)
print(persona.saluta())
print(persona.invecchia(5))

Spiegazione

Nel codice sopra, abbiamo definito un decoratore chiamato log_method_call. Questo decoratore prende come argomento un metodo e restituisce una funzione wrapper che logga la chiamata al metodo originale, insieme agli argomenti passati. La funzione wrapper chiama quindi il metodo originale e restituisce il suo risultato.

Abbiamo poi creato una classe Persona con due metodi: saluta e invecchia. Entrambi i metodi sono decorati con @log_method_call, il che significa che ogni volta che vengono chiamati, verrà eseguito il codice del decoratore prima del codice del metodo stesso.

Quando creiamo un´istanza della classe Persona e chiamiamo i metodi, vedremo nel terminale i log delle chiamate:

Chiamata al metodo: saluta con argomenti: () e kwarg: {}
Ciao, sono Marco e ho 30 anni.
Chiamata al metodo: invecchia con argomenti: (5,) e kwarg: {}
Marco ora ha 35 anni.

Best practice

  • Utilizzare i decoratori per la separazione delle preoccupazioni: I decoratori possono aiutare a mantenere il codice pulito e organizzato, separando la logica di business dalla logica di logging, autenticazione o altre funzionalità trasversali.
  • Documentare i decoratori: Assicurati di documentare i tuoi decoratori con docstring, in modo che gli altri sviluppatori (o te stesso in futuro) possano capire facilmente cosa fa il decoratore.
  • Limitare l´uso dei decoratori: Non abusare dei decoratori. Usali solo quando necessario, poiché un uso eccessivo può rendere il codice difficile da seguire e debug.
  • Testare i decoratori: Scrivi test per assicurarti che i tuoi decoratori funzionino come previsto e non introducano bug nei metodi decorati.

Riepilogo

In questo tutorial, abbiamo esplorato come utilizzare i decoratori in Python per arricchire i metodi delle classi nella programmazione orientata agli oggetti. Abbiamo visto come un semplice decoratore può loggare le chiamate ai metodi, migliorando la tracciabilità e la manutenzione del codice. Ricorda di seguire le best practice per garantire che il tuo codice rimanga leggibile e manutenibile.

Approfondisci con risorse ufficiali

SHARE