2013-04-30 79 views
2

通常的描述符用在类属性,像这样:Python的描述符(__get__,__set__)上功能参数

class Owner(object): 
    attr = Attr() 

当越来越Owner.attrAttr.__get__(self, instance, owner)被称为其中self = Owner.attrinstance = Noneowner = 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'. 

当访问paramAttr.__get__(self, instance, owner)将与self = funct.paraminstance = functowner = funct被称为(尽管ownerinstance是一样的,可能是None?)。 但由于funct不是一个类,所以这不起作用。我如何得到类似于工作的东西?

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

+1

你可以添加一个使用场景来显示如何访问'param'? – unutbu 2013-04-30 13:07:13

+0

这个功能的目的是什么?你是否试图将状态附加到函数中?你是否试图通过参数动态定义函数的行为?你是否试图推迟一些依赖的解析,直到函数被执行? – 2013-04-30 13:22:27

+0

@unutbu我已经添加了一个用例,我认为更适合。你觉得现在更清楚了吗? – siebz0r 2013-04-30 13:31:23

回答

2

函数实际上是Python中的第一类对象,但是您说所描述的语法不会按需要工作时是正确的。您可以使用装饰器来做这样的事情,该装饰器会检查传递的属性,以便启用这种功能。然而,你可能会更好地实现可调用对象,然后将描述符附加到该对象上,并创建可调用对象而不是函数的实例。

+0

我选择了另一种解决问题的方法。但是这种方法将起作用。我的装饰器保存装饰对象的'签名',对于一个函数,可以通过创建一个带有描述符属性的可调用类并将函数包装在'__call__'方法中来实现。然后可以将原始函数的argspec复制到'__call__'方法中。 NICE!注意:这是一个需要使用函数/方法的地方,一个普通的可调用类不够用,但是用装饰器它应该是可能的。 – siebz0r 2013-05-01 11:53:58