5.1 Introduzione ai Decoratori
I decoratori sono funzioni che accettano un'altra funzione come argomento e restituiscono una nuova funzione, modificando o estendendo il comportamento della funzione originale. I decoratori sono utilizzati per migliorare la leggibilità e il riutilizzo del codice.
I decoratori consentono di modificare il comportamento delle funzioni o metodi senza cambiare il loro codice sorgente. Per questo motivo sono ampiamente utilizzati per aggiungere funzionalità, logging, controllo degli accessi e molte altre attività.
La sintassi dei decoratori in Python include l'uso del simbolo @ davanti al nome del decoratore, che viene posizionato prima della definizione della funzione.
@decorator
def my_function():
pass
Questo è equivalente al seguente codice:
def my_function():
pass
my_function = decorator(my_function)
Pensa attentamente a cosa sta succedendo qui: dichiariamo una funzione
my_function
, ma poi la sostituiamo con la funzione decorator
a cui
viene passata la nostra funzione come parametro. La funzione
decorator
può chiamare la nostra funzione a sua discrezione.
5.2 Creare un semplice decoratore
Vediamo un semplice decoratore che stampa un messaggio prima e dopo la chiamata di una funzione.
def my_decorator(func):
def wrapper():
print("Prima della chiamata della funzione")
func()
print("Dopo la chiamata della funzione")
return wrapper
@my_decorator
def say_hello():
print("Ciao!")
say_hello()
Spiegazione
Decoratore (my_decorator)
: Questa funzione prende la funzione func
come
argomento e restituisce una nuova funzione wrapper
, che
chiama func
e aggiunge un comportamento aggiuntivo prima e dopo la sua
chiamata.
Funzione con decoratore (say_hello)
: La funzione say_hello
è avvolta dal decoratore
my_decorator
, che aggiunge un comportamento aggiuntivo quando viene chiamata.
Output:
# Prima della chiamata della funzione
Ciao!
# Dopo la chiamata della funzione
5.3 Decoratori con argomenti
I decoratori possono accettare argomenti, il che permette di configurare il loro comportamento in modo flessibile.
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
func(*args, **kwargs)
return wrapper
return decorator_repeat
@repeat(num_times=3)
def say_hello(name):
print(f"Ciao, {name}!")
say_hello("Alice")
Spiegazione
Decoratore con argomenti (repeat)
: Questa funzione prende l'argomento num_times
e restituisce
il decoratore decorator_repeat
.
Decoratore (decorator_repeat)
: Questo decoratore prende la funzione func
e restituisce una nuova funzione wrapper
, che
chiama func
num_times
volte.
Funzione con decoratore (say_hello)
: La funzione say_hello
viene chiamata tre volte grazie al decoratore repeat
.
Output:
Ciao, Alice!
Ciao, Alice!
Ciao, Alice!
GO TO FULL VERSION