L'property
decorator funziona solo con new-style classi; Vale a dire, le classi che ereditano da object
. D'altra parte, l'acquisizione (che consente l'accesso all'oggetto globale REQUEST
tramite accesso agli attributi) è molto "vecchio-skool" python e le due non funzionano bene insieme, come property
ignora i wrapper di acquisizione, che sono necessari per acquisire l'oggetto REQUEST
.
Zope ha il proprio property
-come metodo che precede classi di nuovo stile e la property
decorater, chiamato ComputedAttribute
, che precede in realtà le classi property
decoratore e nuovo stile da molti anni. Una funzione wrapping ComputedAttribute
non sa come comportarsi con un oggetto con spostamento Acquisition
, tuttavia.
È possibile utilizzare ComputedAttibute
molto simile al property
decoratore:
from ComputedAttribute import ComputedAttribute
class SomeClass():
@ComputedAttribute
def someProperty(self):
return 'somevalue'
La funzione ComputedAttribute
involucro può anche essere configurato con un livello di involucro, che è quello che ci serve quando si tratta di involucri di acquisizione. Non è possibile utilizzare il ComputedAttribute
come decoratore in quel caso:
class SomeClass():
def someValue(self):
return self.REQUEST
someValue = ComputedAttribute(someValue, 1)
E 'abbastanza facile definire una nuova funzione per fare la decorazione per noi però:
from ComputedAttribute import ComputedAttribute
def computed_attribute_decorator(level=0):
def computed_attribute_wrapper(func):
return ComputedAttribute(func, level)
return computed_attribute_wrapper
Stick questo in un modulo di utilità da qualche parte , dopo di che è possibile utilizzare come un decoratore callable per segnare qualcosa come una proprietà di acquisizione-aware:
class SomeClass():
@computed_attribute_decorator(level=1)
def someValue(self):
return self.REQUEST
si noti che diversamente property
, ComputedAttribute
può essere utilizzato solo per getter; non c'è supporto per setter o deleter.
Si utilizza una classe base come Persistenza o Acquisizione? –
Ho ObjectManager come una delle classi base (che eredita da Persistent) – Rastaf
e Acquisition.Implicit. :-) –