推荐学习书目
› 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
PanameraM
V2EX  ›  Python

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

  •  
  •   PanameraM · Mar 17, 2017 · 2758 views
    This topic created in 3479 days ago, the information mentioned may be changed or developed.
    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 replies  •  2017-03-17 10:38:16 +08:00
    weyou
        1
    weyou  
       Mar 17, 2017 via Android   ❤️ 1
    a 被 get 装饰后, a 就成了 wrapper 了啊,访问 a 就是访问 wrapper
    mic0ud
        2
    mic0ud  
       Mar 17, 2017   ❤️ 1
    听说有个叫 functools 的包,里面有个叫 wraps 的装饰器
    mec
        3
    mec  
       Mar 17, 2017   ❤️ 1
    func 被装饰后相当于 a=wrapper(func),这里的 a 其实就是一个 wrapper ,所以 a 就有了__method__属性;需要注意的是: functools.wraps 装饰器会把 func 的一些 metadata 更新到 a 中,比如__name__,__doc__,__module__等属性
    staticor
        4
    staticor  
       Mar 17, 2017   ❤️ 1
    参考 Cookbook 9.1/9.2 http://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p01_put_wrapper_around_function.html

    "\@wraps" 会保留被装饰函数的元信息
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   858 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 86ms · UTC 20:58 · PVG 04:58 · LAX 13:58 · JFK 16:58
    ♥ Do have faith in what you're doing.