Recentemente ho esaminato una base di codice esistente contenente molte classi in cui gli attributi di istanza riflettono i valori memorizzati in un database. Ho riformattato molti di questi attributi per differire le ricerche nel database, ad es. non essere inizializzato nel costruttore ma solo alla prima lettura. Questi attributi non cambiano nel corso della durata dell'istanza, ma rappresentano un vero collo di bottiglia per calcolare quella prima volta e vi si accede realmente solo per casi speciali. Quindi possono anche essere memorizzati nella cache dopo che sono stati recuperati dal database (questo quindi si adatta alla definizione di memoisation in cui l'input è semplicemente "no input").
Mi ritrovo a digitare il seguente frammento di codice più e più volte per vari attributi in varie classi:
class testA(object):
def __init__(self):
self._a = None
self._b = None
@property
def a(self):
if self._a is None:
# Calculate the attribute now
self._a = 7
return self._a
@property
def b(self):
#etc
Esiste già un decoratore per eseguire questa operazione in Python di cui semplicemente non sono a conoscenza? Oppure esiste un modo ragionevolmente semplice per definire un decoratore che fa questo?
Sto lavorando con Python 2.5, ma le risposte 2.6 potrebbero comunque essere interessanti se sono significativamente diverse.
Nota
Questa domanda è stata posta prima che Python includesse molti decoratori già pronti per questo. L'ho aggiornato solo per correggere la terminologia.
functools.lru_cache()
.