Decorator
- design pattern strutturale
- serve quando vogliamo estendere le funzionalità di singoli oggetti dinamicamente
Decoratore di funzione
- funzione che ha come unico argomento una funzione
- restituisce una funzione con lo stesso nome della funzione originale ma con ulteriori funzionalità
Decoratore di classe
- funzione che ha come unico argomento una classe
- restituisce una classe con lo stesso nome della classe originale ma con funzionalità aggiuntive
- può essere utilizzato come alternativa alla creazione di sottoclassi
Function decorator, struttura
- creazione della funzione wrapper
- all’interno del wrapper invochiamo la funzione originale
- prima di invocare la funzione originale possiamo effettuare qualsiasi lavoro di preprocessing
- dopo la chiamata siamo liberi di acquisire il risultato, fare qualsiasi lavoro di postprocessing e di restituire qualsiasi valore vogliamo
- alla fine restituiamo la funzione wrapper come risultato del decoratore
- questa funzione sostituisce la funzione originale acquisendo il suo nome
- per convenzione le funzioni wrapper hanno come argomenti un parametro che indica un numero variabile di parametri e un parametro di tipo keyword
@functool.wraps
- la funzione decorata avrà il valore dell’attributo
__name__
settato a “wrapper” invece che con il nome originale della funzione
- non ha docstring anche nel caso in cui la funzione originale abbia una docstring
Per ovviare a questo inconveniente, la libreria standard di Python include il decoratore @functools.wraps
che può essere usato per decorare una funzione wrapper dentro il decoratore e assicurare che gli attributi __name__
e __doc__
della funzione decorata contengano rispettivamente il nome e la docstring della funzione originale
Class decorator
- eseguiti al termine di uno statement class