V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Tianny
V2EX  ›  Python

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

  •  
  •   Tianny · 2017-03-17 01:19:55 +08:00 · 1978 次点击
    这是一个创建于 2813 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 的属性么?

    4 条回复    2017-03-17 10:38:16 +08:00
    weyou
        1
    weyou  
       2017-03-17 02:04:40 +08:00 via Android   ❤️ 1
    a 被 get 装饰后, a 就成了 wrapper 了啊,访问 a 就是访问 wrapper
    mic0ud
        2
    mic0ud  
       2017-03-17 09:38:48 +08:00   ❤️ 1
    听说有个叫 functools 的包,里面有个叫 wraps 的装饰器
    mec
        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__等属性
    staticor
        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" 会保留被装饰函数的元信息
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6025 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:17 · PVG 10:17 · LAX 18:17 · JFK 21:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.