通常在类属性上使用描述符,如下所示:
class Owner(object):
attr = Attr()
获取Owner.attr
后,在Attr.__get__(self, instance, owner)
,self = Owner.attr
和instance = None
的位置调用owner = Owner
。
实例化Owner
时,instance
将成为Owner
的实例。
现在我想将这个概念应用于方法参数而不是类属性。
它在实践中的表现(让我们假设Attr
的功能是用一个给定的字符串包装一个字符串):
class Example(object):
def funct(self, param=Attr('t')):
return param == 'test' # < param calls the descriptor here
e = Example()
e.funct('es') # < is True because 'es' wrapped with 't' becomes 'test'.
访问param
时,将使用Attr.__get__(self, instance, owner)
,self = funct.param
和instance = funct
调用owner = funct
(尽管{{1}没有意义和owner
相同,可能是instance
?)。
但由于None
不是一个类,所以这不起作用。我怎样才能得到类似的东西?
该函数的装饰器将处理参数,因此这可能会增加我认为的解决方案。 例如,装饰器必须能够更改包装器字符串。
答案 0 :(得分:2)
函数实际上是Python中的第一类对象,但是你说你所描述的语法不能正常工作是正确的。您可以使用装饰器执行此类操作,该装饰器检查传递的属性以获得可实现此类功能的特性。但是,你可能最好不要实现一个可调用的对象,然后将描述符附加到它并创建可调用的实例而不是函数。