我一直在尝试创建一个可以在python中同时使用函数和方法的decorator。这本身并不是那么难,但是当创建一个需要参数的decorator时,似乎是这样。在
class methods(object):
def __init__(self, *_methods):
self.methods = _methods
def __call__(self, func):
def inner(request, *args, **kwargs):
print request
return func(request, *args, **kwargs)
return inner
def __get__(self, obj, type=None):
if obj is None:
return self
new_func = self.func.__get__(obj, type)
return self.__class__(new_func)
上面的代码正确地包装了函数/方法,但是在方法的情况下,request
参数是它操作的实例,而不是第一个非自参数。在
有没有一种方法可以告诉decorator是否应用于函数而不是方法,并相应地进行处理?在
扩展
__get__
方法。这可以概括为decorator-decorator。在这样,您就可以让您的装饰器自动适应它所使用的条件。在
^{pr2}$请注意,包装器函数是在所有函数调用中调用的,所以不要在那里做任何昂贵的操作。在
装饰工的使用:
因为您已经定义了一个
__get__
来在绑定方法上使用修饰符,所以可以传递一个标志,告诉它它是否正在方法或函数上使用。在decorator总是应用于函数对象——让decorator
print
作为其参数的类型,这样您就可以确认了;而且它通常也应该返回一个函数对象(它已经是一个具有正确的__get__
的装饰器了!-)尽管后者也有例外。在也就是说,在准则中:
在类主体中调用}中生成并返回)。在
deco(f)
,并且,当您还在那里时,f
是一个函数,而不是方法类型的实例。(当稍后的f
作为X
的属性或其实例被访问时,该方法在f
的{也许你能更好地解释一下你想让你的装饰师使用的玩具,这样我们可以提供更多的帮助。。。?在
编辑:这也适用于带参数的装饰器,即
^{pr2}$那么在类主体中调用的}返回的任何内容时,该可调用对象仍应返回一个函数对象(一般情况下,有例外;-)。在
deco(23)(f)
,f
仍然是一个函数对象,当作为参数传递给可调用的{相关问题 更多 >
编程相关推荐