函数参数上的Python描述符(__get __,__ set__)

时间:2013-04-30 12:38:09

标签: python function parameters decorator descriptor

通常在类属性上使用描述符,如下所示:

class Owner(object):
    attr = Attr()

获取Owner.attr后,在Attr.__get__(self, instance, owner)self = Owner.attrinstance = 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.paraminstance = funct调用owner = funct(尽管{{1}没有意义和owner相同,可能是instance?)。 但由于None不是一个类,所以这不起作用。我怎样才能得到类似的东西?

该函数的装饰器将处理参数,因此这可能会增加我认为的解决方案。 例如,装饰器必须能够更改包装器字符串。

1 个答案:

答案 0 :(得分:2)

函数实际上是Python中的第一类对象,但是你说你所描述的语法不能正常工作是正确的。您可以使用装饰器执行此类操作,该装饰器检查传递的属性以获得可实现此类功能的特性。但是,你可能最好不要实现一个可调用的对象,然后将描述符附加到它并创建可调用的实例而不是函数。