第一次见到functools.wraps是在 Flask Web开发 中,一直不明白怎么回事。

  装饰器(decorator)是干嘛的?对于受到封装的原函数来说,装饰器能够在那个函数执行前或者执行后分别运行一些代码,使得可以再装饰器里面访问并修改原函数的参数以及返回值,以实现约束定义、调试程序、注册函数等目标。装饰器一般返回一个包装器(wrapper),而functools.wraps就是装饰包装器的装饰器。

先来看一个不使用functools.wraps的装饰器例子。

 1 def tracer(func):2     def wrapper(*args, **kwargs):3         result = func(*args, **kwargs)4         print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))5         return result6     return wrapper7 8 @tracer9 def fibonacci(n):
10     if n in (0,1):
11         return n
12     return (fibonacci(n-1)+fibonacci(n-2))
13
14
15 fibonacci(3)
16 print(fibonacci)
17 print('help:')
18 help(fibonacci)

输出结果:

可以看到,装饰器完全可以正常工作。。。

但是,函数的名字变成装饰器中的包装器了!!!help内置函数也失效了

也就是说,原函数的属性失效了

如果想要保留原函数的属性,就可以用到functools.wraps了

 1 from functools import wraps2 def tracer(func):3     @wraps(func)4     def wrapper(*args, **kwargs):5         result = func(*args, **kwargs)6         print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))7         return result8     return wrapper9
10 @tracer
11 def fibonacci(n):
12     if n in (0,1):
13         return n
14     return (fibonacci(n-1)+fibonacci(n-2))
15
16
17 fibonacci(3)
18 print(fibonacci)
19 print('help:')
20 help(fibonacci)

输出结果:

【Python】functools.wraps定义函数装饰器相关推荐

  1. python基础教程:函数装饰器详解

    谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础:函数装饰器的表现方式 假如你已经定义了一个函数fu ...

  2. Python的神奇功能——函数装饰器MetaClass

    Python中的装饰器,会让很多人望而却步.不要被它吓跑,啃下它,其实超有用,也没有想象中难. 所谓的装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改. Python的装饰 ...

  3. python function at 0x00000_Python函数装饰器原理与用法详解

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  4. Python小白学习之函数装饰器

    装饰器 2018-10-25 13:49:37 装饰器从字面意思就是用来装饰的,在函数可以理解为:在函数中,我们不想影响原来的函数功能,又想给函数添加新的功能,这时候我们就用到了装饰器. 一般函数操作 ...

  5. python装饰器函数-python装饰器1:函数装饰器详解

    先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础:函数装饰器的表现方式 假如你已经定义了 ...

  6. python 三个内置装饰器,python中自带的三个装饰器

    说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...

  7. Python什么是闭包、闭包特征、定义闭包传入一个数求和并输出,定义一个装饰器:打印函数运行花费的时间,定义一个类:要求:包含一个对象属性,且用_(单下划线)命名的定义一个类方法(装饰器)

    1. 闭包.闭包特征及应用 1.1 什么是闭包? 闭包就是外部函数中定义一个内部函数,内部函数引用外部函数中的变量,外部函数的返回值是内部函数; 闭包是由函数及其相关的引用环境组合而成的实体(即:闭包 ...

  8. python装饰器函数-Python函数装饰器指南

    Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...

  9. python装饰器原理-Python函数装饰器原理与用法详解

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

最新文章

  1. SAP RETAIL 使用事务代码WB03去显示一个后台配置的工厂
  2. swift的基础语法(二)
  3. MFC(六)(对话框)
  4. 正则表达式 RegExp【详解】
  5. ubuntu下载chrome等软件
  6. tl494cn逆变器电路图_用TL494制作的逆变电源
  7. 考研高等数学张宇30讲笔记——第一讲 高等数学预备知识
  8. 晶体晶振小结(XTAL与TCXO/VCXO/VC-OCXO等)-持续更新
  9. Window Mobile map solutions
  10. 2022百度春节红包活动 集好运分5亿活动规则
  11. 程序员用代码求救, 同事“秒懂”
  12. 苹果cms怎么采集别人网站的视频
  13. dbz用connector入hana报错Invalid Java object for schema type INT64: class java.util.Long for field “null“
  14. 「 Gazebo仿真 」地图创建、多模型显示、基本指令
  15. GIF录制工具(免安装)
  16. 经营十二条(学习总结)
  17. 微信小程序下载图片到本地
  18. 用Python 做成语接龙,超简单,有语音,过年和孩子玩
  19. 软件测试工程师的优点,合格的软件测试工程师需要必备哪些优点
  20. 浪潮服务器2003系统,浪潮服务器安装WINDOWS 2003操作系统课件.ppt

热门文章

  1. JetBrains放出Java代码质量检查工具Qodana,不了解一下?
  2. 每日一皮:啥一文理解TCP和UDP的区别!这张图才是最屌的!
  3. Metaspace 引起的 FullGC 问题排查过程及解决方案
  4. 我说分布式事务之最大努力通知型事务
  5. 【辟谣】代码规范固然重要,但是不要再黑程序员了...
  6. php 日志处理类,php中自定义日志处理类(类似于java中的log4j)
  7. 黄冈师范计算机考研,2019年黄冈师范学院计算机基础复试自命题考试大纲
  8. Mybatis问题解释?
  9. 【SpringCloud】Feigin-实例
  10. 定点量化误差python仿真.零极点(1)