Python的装饰器用于属性和方法?

2024-10-01 09:41:42 发布

您现在位置:Python中文网/ 问答频道 /正文

如果使用class.something = 2为方法赋值,那么是否可以使用一个修饰符使方法的工作方式类似于属性;如果方法被调用为class.something(2, True),那么它的工作方式是否类似于方法?在

我现在拥有的

更具体地说,我现在有以下内容

class attributeSetter(object):
   ''' Makes functions appear as attributes. Takes care of autologging.'''
   def __init__(self, func):
       self.func = func

   def __set__(self, obj, value):
       return self.func(obj, value)

   def __repr__(self):
       return repr(self.__getattribute__)

因此,对于使用装饰方法的类:

^{pr2}$

我可以这样做:

instance = myClass()
instance.myAttrib = 2  # sets the value to 2
instance.myAttrib *= 4  # now 8
print instance.myAttrib  # 8

我想要什么

但我希望,除此之外,能够做到:

instance.myAttrib(3, add=True)  # now 8 + 3 + 2 = 13
instance.myAttrib(0, subtact=True)  # now 13 + 0 - 2 = 11
print instance.myAttrib  # 11

我的直觉是,我只需要像这样向attributeSetter装饰器添加一个\uuu call_u

def __call__(self, *args, **kwargs):
    self.func(*args, **kwargs)

但是它不允许我使用“=”语法设置值。在

为什么?在

我正在共同开发psychypy(psychphysics中用于刺激传递的python模块),我们希望在设置每个刺激参数时进行一些处理,因此需要使用decorator来避免setter/getter方法。我们默认记录每个属性更改,但在某些情况下,用户希望使用额外的log=False参数来禁用此特定设置的日志记录,或者提供更多参数。因此,在这些情况下,如果能像函数/方法那样使用属性,那就更好了,它实际上就是这样。在


Tags: 方法instanceselftrue参数属性valuedef
1条回答
网友
1楼 · 发布于 2024-10-01 09:41:42

您需要实现一个返回可调用的^{} method;您的decorator已经提供了一个descriptor对象,只需在作为属性访问时使其工作。在

这可以很简单,只需翻转并绑定包装好的函数(这样就得到了一个绑定方法):

class attributeSetter(object):
    ''' Makes functions appear as attributes. Takes care of autologging.'''
    def __init__(self, func):
        self.func = func

    def __get__(self, instance, owner):
        return self.func.__get__(instance, owner)

    def __set__(self, obj, value):
        return self.func(obj, value)

但是这使得它与简单地访问属性不兼容!instance.myAttrib现在返回一个绑定方法!在这里,不能同时使用这两种方法;方法只是绑定属性(因此是通过描述符协议传递的属性),而这些属性恰好是可调用的。在

当然,您可以从__get__返回一个代理对象;该对象实现了__call__方法,并尝试尽可能多地作为底层托管实例属性(您的函数存储在self.__dict__['myAttrib'])中;但这条路径充满了问题,因为代理对象永远不能真正地成为底层属性值。在

相关问题 更多 >