Die sogenannte verzögerte Berechnung von Klassenattributen besteht darin, die Attribute der Klasse als Eigenschaften zu definieren, die nur beim Zugriff berechnet werden. Nach dem Zugriff wird das Ergebnis zwischengespeichert und muss nicht jedes Mal berechnet werden .
Vorteile
Der Hauptzweck der Erstellung eines Lazy-Calculation-Attributs besteht darin, die Leistung zu verbessern
Implementierung
class LazyProperty(object): def __init__(self, func): self.func = func def __get__(self, instance, owner): if instance is None: return self else: value = self.func(instance) setattr(instance, self.func.__name__, value) return valueimport mathclass Circle(object): def __init__(self, radius): self.radius = radius @LazyProperty def area(self): print 'Computing area' return math.pi * self.radius ** 2 @LazyProperty def perimeter(self): print 'Computing perimeter' return 2 * math.pi * self.radius
Erklärung
definiert Eine verzögert ausgewertete Dekoratorklasse LazyProperty. Circle ist eine zum Testen verwendete Klasse. Die Circle-Klasse verfügt über drei Attribute: Radius, Fläche und Umfang. Die Eigenschaften von Fläche und Umfang werden von LazyProperty dekoriert. Probieren wir die Magie von LazyProperty aus:
>>> c = Circle(2) >>> print c.area Computing area 12.5663706144 >>> print c.area 12.5663706144
In area() wird „Rechenfläche“ bei jeder Berechnung einmal gedruckt und c aufgerufen zweimal hintereinander wird „Computing Area“ nur einmal nach .area gedruckt. Dies liegt an LazyProperty. Solange es einmal aufgerufen wird, wird es nicht wiederholt, unabhängig davon, wie viele nachfolgende Aufrufe erfolgen.