Récemment, j'ai parcouru une base de code existante contenant de nombreuses classes où les attributs d'instance reflètent les valeurs stockées dans une base de données. J'ai remanié beaucoup de ces attributs pour que leurs recherches dans la base de données soient différées, c'est-à-dire. ne pas être initialisé dans le constructeur mais uniquement lors de la première lecture. Ces attributs ne changent pas au cours de la durée de vie de l'instance, mais ils constituent un véritable goulot d'étranglement pour calculer cette première fois et ne sont vraiment accessibles que pour des cas particuliers. Par conséquent, ils peuvent également être mis en cache après avoir été récupérés de la base de données (cela correspond donc à la définition de la mémoisation où l'entrée est simplement "aucune entrée").
Je me surprends à taper encore et encore l'extrait de code suivant pour divers attributs dans différentes classes:
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
Existe-t-il déjà un décorateur pour faire cela en Python dont je ne suis tout simplement pas au courant? Ou y a-t-il un moyen raisonnablement simple de définir un décorateur qui fait cela?
Je travaille sous Python 2.5, mais les réponses 2.6 peuvent être intéressantes si elles sont significativement différentes.
Remarque
Cette question a été posée avant que Python n'inclue beaucoup de décorateurs prêts à l'emploi pour cela. Je l'ai mis à jour uniquement pour corriger la terminologie.
functools.lru_cache()
.