Zope:无法访问属性装饰器下的REQUEST

时间:2012-09-22 13:20:11

标签: python properties request zope

我正在尝试在类中使用属​​性装饰器。虽然它本身很有效,但我不能使用任何必须访问REQUEST的代码。

class SomeClass():
   #Zope magic code
   _properties=({'id':'someValue', 'type':'ustring', 'mode':'r'},)

  def get_someValue(self):
    return self.REQUEST

  @property
  def someValue(self):
    return self.REQUEST

尽管调用get_someValue可以获得所需的结果,但尝试访问someValue会引发AttributeError

这种行为背后的逻辑是什么?有没有办法解决这个限制?

(我使用的是Zope 2.13.16,Python 2.7.3)

2 个答案:

答案 0 :(得分:6)

property decorator仅适用于新式类;也就是说,继承自object的类。另一方面,获取(通过属性访问使您可以访问全局REQUEST对象)是非常“老式”的python而且两者不能很好地协同工作,因为property 忽略获取包装器,这是获取REQUEST对象所必需的。

Zope拥有自己的property - 类似方法,可以预先设置新式类和property装饰器,名为ComputedAttribute,它实际上早于property装饰器和多年来的新式课程。但ComputedAttribute包装函数确实知道如何使用Acquisition包装对象来表现。

您可以像ComputedAttibute装饰器一样使用property

from ComputedAttribute import ComputedAttribute

class SomeClass():   
    @ComputedAttribute
    def someProperty(self):
        return 'somevalue'

ComputedAttribute包装函数也可以配置一个包装级别,这是我们处理Acquisition包装器时所需要的。在这种情况下,您无法使用ComputedAttribute作为装饰器:

class SomeClass():   
    def someValue(self):
        return self.REQUEST
    someValue = ComputedAttribute(someValue, 1)

虽然很容易定义一个新功能来为我们做装饰:

from ComputedAttribute import ComputedAttribute

def computed_attribute_decorator(level=0):
    def computed_attribute_wrapper(func):
        return ComputedAttribute(func, level)
    return computed_attribute_wrapper

将其粘贴在某个实用程序模块中,之后您可以将其用作可调用的装饰器,将某些内容标记为可识别采集的属性:

class SomeClass(): 
    @computed_attribute_decorator(level=1)
    def someValue(self):
        return self.REQUEST

请注意,与property不同,ComputedAttribute只能用于获取者;没有对制定者或删除者的支持。

答案 1 :(得分:3)

如果您想绕过需要获取的路由,并且无法在类的构造函数中显式设置调用代码的请求,请使用zope.globalrequest。否则,您可能需要考虑浏览器视图(它总是多次调整某些上下文和请求)。