Die property
decorator funktioniert nur mit neuen Stil Klassen; das heißt, Klassen, die von object
erben. Acquisition (das gibt Ihnen Zugriff auf die globale REQUEST
Objekt über Attributzugriff) auf der anderen Seite ist sehr viel "old-skool" Python und die beiden nicht gut zusammen, wie property
ignoriert Erwerb Wrapper, die benötigt werden, um zu erwerben das Objekt REQUEST
.
Zope hat eine eigene property
-ähnlichen Methode ist, die neue Stil-Klassen und die property
decorater früher, genannt ComputedAttribute
, die eigentlich schon vor die property
Dekorateur und neuen Stil Klassen von vielen Jahren. Eine ComputedAttribute
-wrapped-Funktion weiß jedoch, wie sie sich mit einem Acquisition
-Wrapped-Objekt verhält.
können Sie ComputedAttibute
verwenden viel wie der property
Dekorateur:
from ComputedAttribute import ComputedAttribute
class SomeClass():
@ComputedAttribute
def someProperty(self):
return 'somevalue'
Die ComputedAttribute
Wrapper-Funktion kann auch mit einem Pegel von Wickel konfiguriert werden, das, was wir brauchen, ist, wenn sie mit Acquisition-Wrapper zu tun. Sie können nicht die ComputedAttribute
als Dekorateur in diesem Fall verwenden:
class SomeClass():
def someValue(self):
return self.REQUEST
someValue = ComputedAttribute(someValue, 1)
Es ist leicht genug, um eine neue Funktion zu definieren, wenn für uns die Dekoration zu tun:
from ComputedAttribute import ComputedAttribute
def computed_attribute_decorator(level=0):
def computed_attribute_wrapper(func):
return ComputedAttribute(func, level)
return computed_attribute_wrapper
Halten Sie diese in einem Versorgungsmodul irgendwo , nach dem Sie dann als aufrufbare Dekorateur verwenden sie etwas als Acquisition-aware Eigenschaft zu markieren:
class SomeClass():
@computed_attribute_decorator(level=1)
def someValue(self):
return self.REQUEST
Beachten Sie, dass im Gegensatz zu property
, ComputedAttribute
kann nur für Getter verwendet werden; Es gibt keine Unterstützung für Setter oder Deleter.
Verwenden Sie eine Basisklasse wie Persistence oder Acquisition? –
Ich habe ObjectManager als eine der Basisklassen (die von Persistent erbt) – Rastaf
sowie Acquisition.Implicit. :-) –