如果使用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参数来禁用此特定设置的日志记录,或者提供更多参数。因此,在这些情况下,如果能像函数/方法那样使用属性,那就更好了,它实际上就是这样。在
您需要实现一个返回可调用的^{} method ;您的decorator已经提供了一个descriptor对象,只需在作为属性访问时使其工作。在
这可以很简单,只需翻转并绑定包装好的函数(这样就得到了一个绑定方法):
但是这使得它与简单地访问属性不兼容!
instance.myAttrib
现在返回一个绑定方法!在这里,不能同时使用这两种方法;方法只是绑定属性(因此是通过描述符协议传递的属性),而这些属性恰好是可调用的。在当然,您可以从
__get__
返回一个代理对象;该对象实现了__call__
方法,并尝试尽可能多地作为底层托管实例属性(您的函数存储在self.__dict__['myAttrib']
)中;但这条路径充满了问题,因为代理对象永远不能真正地成为底层属性值。在相关问题 更多 >
编程相关推荐