Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。

wraps内置方法的作用

查看一个函数的帮助文档有两种方法:func_name.__doc__

help(func_name)

先来看一个例子,定义timmer装饰器和index函数,并且都添加了帮助文档。import time

def timmer(func):

def inner(*args,**kwargs):

'wrapper inner function'

start_time=time.time()

res=func(*args,**kwargs)

end_time=time.time()

print("run time: %s " %(end_time-start_time))

return res

return inner

def index():

'index function'

time.sleep(2)

print("welcome to index page")

在index没有被timmer装饰前,来查看index的帮助文档:print(index.__doc__)

程序运行结果:index function

然后为index添加timmer装饰器,再次查看index函数的帮助文档:import time

def timmer(func):

def inner(*args,**kwargs):

'wrapper inner function'

start_time=time.time()

res=func(*args,**kwargs)

end_time=time.time()

print("run time: %s " %(end_time-start_time))

return res

return inner

@timmer

def index():

'index function'

time.sleep(2)

print("welcome to index page")

print(index.__doc__)

程序运行结果:wrapper inner function

可以看到,在为index函数添加装饰器后,index函数的帮助文档变成装饰器timmer内部函数的帮助文档了。

换句话说,就是原始index函数内部的数据被装饰器timmer修改了。

怎么样才能在保留原始被装饰函数的数据的前提下,为函数添加新功能呢??就是python内置的wraps装饰器。

导入wraps装饰器,修改上面的代码,为timmer的内部函数添加wraps装饰器,然后再次查看被装饰函数的帮助文档:import time

from functools import wraps

def timmer(func):

@wraps(func)

def inner(*args,**kwargs):

'wrapper inner function'

start_time=time.time()

res=func(*args,**kwargs)

end_time=time.time()

print("run time: %s " %(end_time-start_time))

return res

return inner

@timmer

def index():

'index function'

time.sleep(2)

print("welcome to index page")

print(index.__doc__)

运行程序,执行结果如下:index function

可以看到,index函数即使添加了装饰器,其内部的原始数据仍然没有被装饰器修改。

从上面的示例可以看出,wraps装饰器的作用就是保留被装饰对象的原始数据信息。

实例一:

不加wraps# -*- coding=utf-8 -*-

from functools import wraps

def my_decorator(func):

def wrapper(*args, **kwargs):

'''decorator'''

print('Calling decorated function...')

return func(*args, **kwargs)

return wrapper

@my_decorator

def example():

"""Docstring"""

print('Called example function')

print(example.__name__, example.__doc__)

执行结果:('wrapper', 'decorator')

实例二:

加wraps# -*- coding=utf-8 -*-

from functools import wraps

def my_decorator(func):

@wraps(func)

def wrapper(*args, **kwargs):

'''decorator'''

print('Calling decorated function...')

return func(*args, **kwargs)

return wrapper

@my_decorator

def example():

"""Docstring"""

print('Called example function')

print(example.__name__, example.__doc__)

执行结果:('example', 'Docstring')

总结:

warps 作用: 消除(被装饰后的函数名等属性的改变)副作用。

相关推荐:

python内置哪些装饰器_Python内置的wraps装饰器有什么用相关推荐

  1. 不是python内置函数的是_Python内置函数

    print(abs(2)) #求出绝对值 print(all(([],1,3))) #传1个可跌倒对象,元素中包含的全部为可迭代对象,返回True 其他返回False #如果可迭代对象是空,就返回Tr ...

  2. 如何使用python装饰器_Python学习之如何使用装饰器 @decorator

    建议大家在看这篇文章之前还是点击上面这篇文章看一下,先了解一下什么是装饰器之后再看. 猿人学python之我的学习笔记分享:如何使用装饰器 @decorator 上面代码中使用装饰器的方法看起来有点复 ...

  3. python内置库有哪些_python 内置库

    广告关闭 回望2020,你在技术之路上,有什么收获和成长么?对于未来,你有什么期待么?云+社区年度征文,各种定制好礼等你! version: 0. 2.0, configurations: }, de ...

  4. python内置对象的实现_Python 内置对象的实现

    准备回顾一下python源代码,不过不准备说的太细,尽量勾勒框架,不引用代码. python中所有东西都是对象,进一步地,这些对象可以分为类型对象(type)or实例对象,有时一个对象即可以是类型,也 ...

  5. python编程内置函数使用方法_Python内置函数 next的具体使用方法

    Python 3中的File对象不支持next()方法. Python 3有一个内置函数next(),它通过调用其next ()方法从迭代器中检索下一个项目. 如果给定了默认值,则在迭代器耗尽返回此默 ...

  6. python内置对象是什么_Python内置对象类型之数字类型

    Python中有6种内置对象类型 整数.浮点数–Number 字符串–String 列表–List 元组–Tuple 字典–Dictionary 集合–Set 不可变类型:Number.String. ...

  7. python内置函数下划线_python(内置函数)

    检测本文件中对象是否存在 # -*- coding: utf-8 -*- import sys x=10 obj1=sys.modules[__name__] print(hasattr(obj1,& ...

  8. python提供的内置函数有哪些_python内置函数介绍

    内置函数,一般都是因为使用频率比较频繁,所以通过内置函数的形式提供出来.对内置函数通过分类分析,基本的数据操作有数学运算.逻辑操作.集合操作.字符串操作等. 说起我正式了解内置函数之前,接触到的是la ...

  9. python在匿名函数作和_python内置函数和匿名函数

    楔子 在讲新知识之前,我们先来复习复习函数的基础知识. 问:函数怎么调用? 函数名() 如果你们这么说...那你们就对了!好了记住这个事儿别给忘记了,咱们继续谈下一话题... 来你们在自己的环境里打印 ...

最新文章

  1. 解决运行eclipse内存不足的问题
  2. Axure RP9 自学之路2-基础操作篇
  3. [CALayer release]: message sent to deallocated instance
  4. nginx配置文件中location与root访问时的联系
  5. python 问题自动匹配解决方案_最好的 Python IDE,你们推荐使用哪一个?
  6. Kotlin学习笔记22 协程part2 join CoroutineScope 协程vs线程
  7. php mencache扩展,【memcache缓存专题(3)】PHP-memcache扩展的安装以及使用
  8. P4777 【模板】扩展中国剩余定理(EXCRT)
  9. Dell台式计算机BIOS放电,戴尔BIOS设置电池维修笔记本电脑电池BIOS设置图形方法...
  10. Alibaba珍藏版mybatis手写文档,值得一读!
  11. 【RFID】天线技术
  12. IC 后端仿真: process corner 和 PVT
  13. CHAPTER 2 目录及文件
  14. 配置静态NAT和配置动态NAT
  15. Javaweb后端阶段
  16. 蓝桥杯单片机组(CT107D 开发板)总结
  17. TensorFlow1.14或TensorFlow2内部获取mfcc原理探索(matlab复现或python复现)
  18. 嵌入式软件工程师相关的应聘要求
  19. 离散数学 求命题公式的主析取范式和主合取范式
  20. Xshell 7 无法启动 win7

热门文章

  1. Shell练习(十一)
  2. 检查硬件变化的命令kudzu
  3. 10种开发以及改善应用的低成本方法
  4. 【BZOJ 1222】 [HNOI2001] 产品加工(DP)
  5. Adtran加入SDN大潮,剑指运营商SDN转型
  6. oracle连接中出现错误ORA-12541,ORA-12514,ORA-01017的解决方法
  7. Android开发文档
  8. kvm启动报错Could not access KVM kernel module: Permission denied
  9. 四周第五次课(1月6日) 6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩
  10. 题目1022:游船出租(结构体使用)