def get(path):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
return func(*args, **kw)
wrapper.__method__ = 'GET'
return wrapper
return decorator
假设 func 函数名是 a
print(a.__method__) 的结果就是‘ GET'
我的问题:
这个__method__属性是怎么传递给 func 的,不是 wrapper 的属性么?
1
weyou 2017-03-17 02:04:40 +08:00 via Android 1
a 被 get 装饰后, a 就成了 wrapper 了啊,访问 a 就是访问 wrapper
|
2
mic0ud 2017-03-17 09:38:48 +08:00 1
听说有个叫 functools 的包,里面有个叫 wraps 的装饰器
|
3
mec 2017-03-17 10:21:11 +08:00 1
func 被装饰后相当于 a=wrapper(func),这里的 a 其实就是一个 wrapper ,所以 a 就有了__method__属性;需要注意的是: functools.wraps 装饰器会把 func 的一些 metadata 更新到 a 中,比如__name__,__doc__,__module__等属性
|
4
staticor 2017-03-17 10:38:16 +08:00 1
参考 Cookbook 9.1/9.2 http://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p01_put_wrapper_around_function.html
"\@wraps" 会保留被装饰函数的元信息 |