【Python】functools.wraps定义函数装饰器
第一次见到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定义函数装饰器相关推荐
- python基础教程:函数装饰器详解
谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础:函数装饰器的表现方式 假如你已经定义了一个函数fu ...
- Python的神奇功能——函数装饰器MetaClass
Python中的装饰器,会让很多人望而却步.不要被它吓跑,啃下它,其实超有用,也没有想象中难. 所谓的装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改. Python的装饰 ...
- python function at 0x00000_Python函数装饰器原理与用法详解
本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...
- Python小白学习之函数装饰器
装饰器 2018-10-25 13:49:37 装饰器从字面意思就是用来装饰的,在函数可以理解为:在函数中,我们不想影响原来的函数功能,又想给函数添加新的功能,这时候我们就用到了装饰器. 一般函数操作 ...
- python装饰器函数-python装饰器1:函数装饰器详解
先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础:函数装饰器的表现方式 假如你已经定义了 ...
- python 三个内置装饰器,python中自带的三个装饰器
说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...
- Python什么是闭包、闭包特征、定义闭包传入一个数求和并输出,定义一个装饰器:打印函数运行花费的时间,定义一个类:要求:包含一个对象属性,且用_(单下划线)命名的定义一个类方法(装饰器)
1. 闭包.闭包特征及应用 1.1 什么是闭包? 闭包就是外部函数中定义一个内部函数,内部函数引用外部函数中的变量,外部函数的返回值是内部函数; 闭包是由函数及其相关的引用环境组合而成的实体(即:闭包 ...
- python装饰器函数-Python函数装饰器指南
Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...
- python装饰器原理-Python函数装饰器原理与用法详解
本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...
最新文章
- SAP RETAIL 使用事务代码WB03去显示一个后台配置的工厂
- swift的基础语法(二)
- MFC(六)(对话框)
- 正则表达式 RegExp【详解】
- ubuntu下载chrome等软件
- tl494cn逆变器电路图_用TL494制作的逆变电源
- 考研高等数学张宇30讲笔记——第一讲 高等数学预备知识
- 晶体晶振小结(XTAL与TCXO/VCXO/VC-OCXO等)-持续更新
- Window Mobile map solutions
- 2022百度春节红包活动 集好运分5亿活动规则
- 程序员用代码求救, 同事“秒懂”
- 苹果cms怎么采集别人网站的视频
- dbz用connector入hana报错Invalid Java object for schema type INT64: class java.util.Long for field “null“
- 「 Gazebo仿真 」地图创建、多模型显示、基本指令
- GIF录制工具(免安装)
- 经营十二条(学习总结)
- 微信小程序下载图片到本地
- 用Python 做成语接龙,超简单,有语音,过年和孩子玩
- 软件测试工程师的优点,合格的软件测试工程师需要必备哪些优点
- 浪潮服务器2003系统,浪潮服务器安装WINDOWS 2003操作系统课件.ppt
热门文章
- JetBrains放出Java代码质量检查工具Qodana,不了解一下?
- 每日一皮:啥一文理解TCP和UDP的区别!这张图才是最屌的!
- Metaspace 引起的 FullGC 问题排查过程及解决方案
- 我说分布式事务之最大努力通知型事务
- 【辟谣】代码规范固然重要,但是不要再黑程序员了...
- php 日志处理类,php中自定义日志处理类(类似于java中的log4j)
- 黄冈师范计算机考研,2019年黄冈师范学院计算机基础复试自命题考试大纲
- Mybatis问题解释?
- 【SpringCloud】Feigin-实例
- 定点量化误差python仿真.零极点(1)