Kürzlich habe ich eine vorhandene Codebasis durchlaufen, die viele Klassen enthält, in denen Instanzattribute in einer Datenbank gespeicherte Werte widerspiegeln. Ich habe viele dieser Attribute überarbeitet, damit ihre Datenbanksuchen verschoben werden, d. H. nicht im Konstruktor initialisiert werden, sondern erst beim ersten Lesen. Diese Attribute ändern sich nicht über die Lebensdauer der Instanz, stellen jedoch einen echten Engpass bei der Berechnung des ersten Males dar und werden nur in besonderen Fällen wirklich aufgerufen. Daher können sie auch zwischengespeichert werden, nachdem sie aus der Datenbank abgerufen wurden (dies entspricht daher der Definition der Memoisierung, bei der die Eingabe einfach "keine Eingabe" ist).
Ich tippe immer wieder den folgenden Codeausschnitt für verschiedene Attribute in verschiedenen Klassen ein:
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
Gibt es in Python bereits einen Dekorateur, der dies einfach nicht kennt? Oder gibt es eine einigermaßen einfache Möglichkeit, einen Dekorateur zu definieren, der dies tut?
Ich arbeite unter Python 2.5, aber 2.6-Antworten könnten immer noch interessant sein, wenn sie sich erheblich unterscheiden.
Hinweis
Diese Frage wurde gestellt, bevor Python viele fertige Dekorateure dafür einbezog. Ich habe es nur aktualisiert, um die Terminologie zu korrigieren.
functools.lru_cache()
.