加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Zope:无法在属性装饰器下访问REQUEST

发布时间:2020-12-16 23:41:48 所属栏目:Python 来源:网络整理
导读:我正在尝试在类中使用属??性装饰器.虽然它本身很好用,但我不能使用任何必须访问REQUEST的代码. class SomeClass(): #Zope magic code _properties=({'id':'someValue','type':'ustring','mode':'r'},) def get_someValue(self): return self.REQUEST @proper
我正在尝试在类中使用属??性装饰器.虽然它本身很好用,但我不能使用任何必须访问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)

解决方法

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

Zope有自己的类似属性的方法,它可以预先设置新式类和属性decorater,称为ComputedAttribute,它实际上早在属性装饰器和新式类之前就已经存在多年了.但是,ComputedAttribute包装函数确实知道如何使用Acquisition-wrapped对象进行操作.

您可以像使用属性装饰器一样使用ComputedAttibute:

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

请注意,与属性不同,ComputedAttribute只能用于getter;不支持制定者或删除者.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读