python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变
2019-01-01 22:58
218 查看
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。
废话不多说,上俩栗子就能搞明白!
实例一:
不加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的作用和使用
- python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域(装饰器基础)
- python装饰器:有参数的装饰器、不定长参数的装饰器、装饰有返回值的函数、通用的装饰器
- python装饰器:有参数的装饰器、不定长参数的装饰器、装饰有返回值的函数、通用的装饰器
- python装饰器的4中类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类
- python-实现属性可修改的函数装饰器-28
- fcntl函数(作用就是改变文件描述符的属性struct file)
- python_装饰器二(对有/不定长参数函数的装饰)
- python 9-4 如何实现属性可修改的函数装饰器,python3 nolocal或者在python2中列表方式
- python----多个装饰器装饰一个函数
- python: 从函数了解到装饰器
- Python学习笔记-1(变量、类型、函数、类、作用域)
- python中eval函数作用
- 9、Python学习笔记--函数递归、装饰器
- [Python05]-函数高级属性续
- python基础之函数参数、嵌套、返回值、对象、命名空间和作用域
- Python入门 第五天(装饰器、偏函数)
- python 函数超时装饰器
- python 装饰器 二 (装饰带参数的函数)