如何理解Python装饰器

装饰器本质

装饰器本质上是用一个新的函数替换原先的函数.

@logged
def f(x):
   """does some math"""
   return x + x * x

本质上是如下语句

f = logged(f)

使用wraps保存原函数的namedoc属性

单纯使用之前的装饰器会出现一个问题 -- 用新函数替代老函数后, 我们丢失了老函数的一些属性信息, 比如name, doc_, 这在规范的工程代码中是很不好的.

还好, python为我们提供了一个简单的解决方案, 只要在装饰函数的定义上加上一个@wraps(func)就可以了.

from functools import wraps
def logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print func.__name__ + " was called"
        return func(*args, **kwargs)
    return with_logging

@logged
def f(x):
   """does some math"""
   return x + x * x

print f.__name__  # prints 'f'
print f.__doc__   # prints 'does some math'

这个@wraps(func)记号会自动把函数名, docstring, 参数列表等原函数属性都一一复制到最后替换的新函数这里, 让新函数的信息显示正确.

参考资料

https://stackoverflow.com/questions/308999/what-does-functools-wraps-do
https://stackoverflow.com/questions/739654/how-to-make-a-chain-of-function-decorators/1594484#1594484

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Python的装饰器(decorator)是一个很棒的机制,也是熟练运用Python的必杀技之一。装饰器,顾名思义...
    温柔的倾诉阅读 3,064评论 0 0
  • 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返...
    胡一巴阅读 3,146评论 0 0
  • 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,...
    chen_000阅读 5,154评论 0 3
  • 当我被地铁里的人群 挤成肉饼的时候 我深深的感觉 我并不孤独 我还没有资格孤独 孤独该是有独立的 私人空间 才会产...
    伊玛雅阅读 1,072评论 0 0
  • 天气凉爽的一天,恰巧是高考的日子。在匆忙的人群中,有多少父母为孩子祝福着,加油着。十年寒窗,终有一日为学习的劳苦画...
    73aa14a52afe阅读 643评论 0 0

友情链接更多精彩内容