Récemment, j'ai parcouru une base de code existante contenant de nombreuses classes dont les attributs d'instance reflètent des valeurs stockées dans une base de données. J'ai remanié un grand nombre de ces attributs pour que la consultation de la base de données soit différée, c'est-à-dire qu'elle ne soit pas initialisée dans le constructeur mais seulement à la première lecture. Ces attributs ne changent pas pendant la durée de vie de l'instance, mais ils sont un vrai goulot d'étranglement pour être calculés la première fois et ne sont vraiment utilisés que dans des cas particuliers. Par conséquent, ils peuvent également être mis en cache après avoir été récupérés dans la base de données (ce qui correspond donc à la définition de l'expression mémorisation où l'entrée est simplement "aucune entrée").
Je me retrouve à taper le bout de code suivant encore et encore pour divers attributs dans diverses 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 un décorateur pour faire cela en Python dont je ne suis pas au courant ? Ou bien, existe-t-il un moyen raisonnablement simple de définir un décorateur qui fasse cela ?
Je travaille sous Python 2.5, mais les réponses 2.6 pourraient être intéressantes si elles sont significativement différentes.
Note
Cette question a été posée avant que Python n'inclue beaucoup de décorateurs prêts à l'emploi pour cela. Je l'ai mise à jour uniquement pour corriger la terminologie.
0 votes
J'utilise Python 2.7, et je ne vois rien concernant des décorateurs prêts à l'emploi pour cela. Pouvez-vous fournir un lien vers les décorateurs prêts à l'emploi mentionnés dans la question ?
0 votes
@Bamcclur désolé, il y avait d'autres commentaires les détaillant, je ne sais pas pourquoi ils ont été supprimés. Le seul que je peux trouver pour le moment est celui de Python 3 :
functools.lru_cache()
.0 votes
Je ne suis pas sûr qu'il y ait des modules intégrés (au moins pour Python 2.7), mais il y a la bibliothèque Boltons avec propriété en cachette
0 votes
@guyarad Je n'ai pas vu ce commentaire jusqu'à maintenant. C'est une bibliothèque fantastique ! Publie-le comme réponse pour que je puisse l'upvoter.