请教,关于装饰器的一个小问题

2017-03-17 01:19:55 +08:00
 Tianny
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 的属性么?

1993 次点击
所在节点    Python
4 条回复
weyou
2017-03-17 02:04:40 +08:00
a 被 get 装饰后, a 就成了 wrapper 了啊,访问 a 就是访问 wrapper
mic0ud
2017-03-17 09:38:48 +08:00
听说有个叫 functools 的包,里面有个叫 wraps 的装饰器
mec
2017-03-17 10:21:11 +08:00
func 被装饰后相当于 a=wrapper(func),这里的 a 其实就是一个 wrapper ,所以 a 就有了__method__属性;需要注意的是: functools.wraps 装饰器会把 func 的一些 metadata 更新到 a 中,比如__name__,__doc__,__module__等属性
staticor
2017-03-17 10:38:16 +08:00
参考 Cookbook 9.1/9.2 http://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p01_put_wrapper_around_function.html

"\@wraps" 会保留被装饰函数的元信息

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/348077

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX