El property
decorator sólo funciona con nuevo estilo clases; es decir, clases que heredan de object
. Adquisición (que le da acceso a la REQUEST
objeto global a través de acceso atributo) por el contrario es mucho pitón 'vieja escuela' y los dos no trabajan bien juntos, como property
ignora envoltorios de adquisición, que son necesarios para adquirir el objeto REQUEST
.
Zope tiene su propio property
-como método que es anterior a clases de nuevo estilo y la property
decorater, llamado ComputedAttribute
, que en realidad es anterior a los property
las clases de decorador y de nuevo estilo por muchos años. Un ComputedAttribute
función -wrapped sabe cómo comportarse con un objeto -wrapped Acquisition
, sin embargo.
Puede utilizar ComputedAttibute
al igual que el property
decorador:
from ComputedAttribute import ComputedAttribute
class SomeClass():
@ComputedAttribute
def someProperty(self):
return 'somevalue'
La función ComputedAttribute
envoltorio también se puede configurar con un nivel de envoltura, que es lo que necesitamos cuando se trata de envolturas de adquisición. No se puede utilizar el ComputedAttribute
como decorador en ese caso:
class SomeClass():
def someValue(self):
return self.REQUEST
someValue = ComputedAttribute(someValue, 1)
Es bastante fácil de definir una nueva función para hacer la decoración para nosotros, sin embargo:
from ComputedAttribute import ComputedAttribute
def computed_attribute_decorator(level=0):
def computed_attribute_wrapper(func):
return ComputedAttribute(func, level)
return computed_attribute_wrapper
Pegue esto en un módulo de utilidad alguna parte , después de lo cual se puede luego usarlo como un decorador exigible a marcar algo como una propiedad de Adquisición-consciente:
class SomeClass():
@computed_attribute_decorator(level=1)
def someValue(self):
return self.REQUEST
Tenga en cuenta que a diferencia de property
, ComputedAttribute
solo se puede usar para getters; no hay soporte para setters o deleters.
¿Utiliza una clase base como la persistencia o la adquisición? –
Tengo ObjectManager como una de las clases base (que hereda de Persistent) – Rastaf
, así como Acquisition.Implicit. :-) –