对装饰器@wraps的解释(一看就懂)-- 并对装饰器详解
1. 先看一段代码
def is_login(func):def foo(*args,**kwargs):return func(*args,**kwargs)return foodef test():print('我是:',test.__name__)@is_login
def test1():print('我是:',test1.__name__)
@is_login
def test2():print('我是:',test2.__name__)test()
test1()
test2()>>>>我是: test
我是: foo
我是: foo
可以发现函数的函数名即 name已被装饰器改变
2.那我们来增加@wraps
from functools import wrapsdef is_login(func):@wraps(func)def foo(*args,**kwargs):return func(*args,**kwargs)return foodef test():print('我是:',test.__name__)@is_login
def test1():print('我是:',test1.__name__)
@is_login
def test2():print('我是:',test2.__name__)test()
test1()
test2()>>>>
我是: test
我是: test1
我是: test2
结论:
可以看见@wraps可以保证装饰器修饰的函数的name的值保持不变
补充:装饰的优化
以时间装饰器为例,进行优化
- 装饰器的统一模板
from functools import wraps
# 对函数的装饰器, 对类func最好为cls
def decorate(func):@wraps(func)# 增添或修改功能的函数def wrapper(*args,**kwargs):# 执行被装饰的函数result = func(*args,**kwargs) # 返回结果return result# 返回内层函数return wrapper
普通--时间装饰器
from functools import wraps
import time
from random import randintdef use_time(func):@wraps(func)def wrapper(*args,**kwargs):st_time = time.time()result = func(*args,**kwargs)end_time = time.time()print(f'{func.__name__}函数use_time:{end_time-st_time}s')return wrapper@use_time
def foo():time.sleep(randint(1,3))for _ in range(3):foo()#输出
>>>>
foo函数use_time:1.0007495880126953s
foo函数use_time:3.0018675327301025s
foo函数use_time:3.0030477046966553s
下面对改装饰器进行优化(解耦)
- 可以发先上面时间装饰器计算的结果,只能在控制台上打印
- 那我们怎样才能将它输出为日志呢???
- 我们需要将他的结果进行自定输出
# 在增加一层函数
from functools import wraps
import time
from random import randintdef record(output):def use_time(func):@wraps(func)def wrapper(*args,**kwargs):st_time = time.time()result = func(*args,**kwargs)end_time = time.time()
# print(f'{func.__name__}函数use_time:{end_time-st_time}s')output(func.__name__, end_time-st_time)return wrapperreturn use_time# 改装饰器的结果就可以自定义了,下面以print函数为例
@record(print)
def foo():time.sleep(randint(2,5))for _ in range(3):foo()
>>>>
foo 3.000645875930786
foo 4.003818988800049
foo 2.0020666122436523
结果输出日志
- 只需要自己定义一个函数
def write_log(name,content):with open('./time.log','a')as f:f.write(f'{name}耗时:{content}\r\n') # \r\n 换行# 只需要将装饰器改为@record(write_log)
@record(write_log)
def foo():time.sleep(randint(2,5))for _ in range(3):foo()
效果如下
作者:憧憬001
链接:https://www.jianshu.com/p/5df1769e562e
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
对装饰器@wraps的解释(一看就懂)-- 并对装饰器详解相关推荐
- 一看就懂的i++和++i详解
前言 转载请说明出处,本文来自Android菜鸟:https://blog.csdn.net/android_cai_niao/article/details/106027313 QQ:2717521 ...
- python ssl模块用法详解_一看就懂,Python 日志模块详解及应用!
日志概述 百度百科的日志概述: Windows网络操作系统都设计有各种各样的日志文件,如应用程序日志,安全日志.系统日志.Scheduler服务日志.FTP日志.WWW日志.DNS服务器日志等等,这些 ...
- python alpha beta 剪枝_一看就懂的 Alpha-Beta 剪枝算法详解
Alpha-Beta剪枝用于裁剪搜索树中没有意义的不需要搜索的树枝,以提高运算速度. 假设α为下界,β为上界,对于α ≤ N ≤ β: 若 α ≤ β 则N有解. 若 α > β 则N无解. ...
- 一看就懂的Alpha-Beta剪枝算法详解
原贴:http://blog.csdn.net/tangchenyi/article/details/22925957 Alpha-Beta剪枝算法(Alpha Beta Pruning) [说明] ...
- 绿建科技加密图纸查看器安装_施工图看不懂?1.1G工程施工图纸详解,253页图文合集一查就清楚...
施工图看不懂?1.1G工程施工图纸详解,253页图文合集一查就清楚 只要是对建筑行业,有所了解的朋友都清楚,钢筋施工图纸对于建筑物,有着举足轻重的地位!一点都不得马虎大意,接触建筑行业,第一步还是需 ...
- 教你看懂车牌号——全国车牌详解细表
教你看懂车牌号--全国车牌详解细表 北京市(京) A B(出租车) C E F H G(远郊区县) 天津市(津) A B C E(出租车) 河北省(冀) A 石家庄市 B ...
- 联想微型计算机s5l5主板,看清再买! 笔记本保修条例详解 联想篇
看清再买! 笔记本保修条例详解 联想篇 已经成为国际级企业的PC巨头联想在国内拥有非常高的知名度,尤其是今年以来,联想更是推出了多款设计非常优秀.外观非常漂亮的本本.对于消费者来说 (本文共1页) 阅 ...
- git合并分支——带图解释一看就懂版
git合并分支(一看就懂) 首先,我们创建dev分支,然后切换到dev分支: $ git checkout -b dev Switched to a new branch 'dev' git chec ...
- 怎么查看笔记本内存条型号_笔记本配置参数怎么看 笔记本配置参数查看方法【详解】...
在科技高速发展的时代,很多人都想拥有一台属于自己的电脑或者笔记本,在选购电脑或者笔记本时,我们总会面对一堆参数,虽然有些参数只要选数字大的准没错,但其具体代表什么意思,不少用户还真不知道,更不用说一些 ...
- CAD手机看图软件中多线段编辑详解
很多人在使用CAD手机看图软件查看CAD图纸的过程中,有些时候需要对图纸中的多线段进行简单的编辑,这个时候该怎么操作呢?下面以浩辰CAD看图王手机版来给大家详细介绍一下CAD手机看图软件中多线段编辑的 ...
最新文章
- JS~字符串长度判断,超出进行自动截取(支持中文)
- 【深度学习】深入浅出数字图像处理基础(模型训练的先修课)
- python贴吧回帖-python控制浏览器爬取百度贴吧回复并写入Excel
- IIS Form 认证 保护HTML页面
- win7计算机管理找不到文件夹,Win7系统打开组策略提示找不到文件gpedit.msc怎么办...
- CF662C Binary Table(FWT)
- 前端开发 容器标签span与div 0228
- Android功耗优化(7)---如何分析wakelock(wakeup source)持锁问题
- 实验一 命令解释程序的编写
- c语言全民,C语言还有学习的必要吗
- BZOJ5092:[Lydsy1711月赛]分割序列(贪心,高维前缀和)
- RabbitMQ入门:发布/订阅(Publish/Subscribe)
- 王道计算机考研数据结构—学习笔记Chapter Five 串String
- 读史可以明智_为什么拥抱传统是明智的
- CSS特效三:简单的便签效果
- 100本最棒的web前端图书推荐
- 利用Google Map显示指定位置地理位置
- 阿里内部使用的12 款开发工具,很多人可能都没听过
- SpringSecurity-基于微服务的认证与权限访问
- 打成jar包 在命令行下执行java工程
热门文章
- sql特殊字符转义,oracle中将字符 ‘ 转义
- 2022-2028年中国自动驾驶系统行业现状调研分析报告
- 2022-2028年中国钢桶行业市场研究及前瞻分析报告
- libgstreamer-1.0.so.0: cannot open shared object file: No such file or directory
- 2022-2028年中国中密度纤维板市场投资分析及前景预测报告
- 2022-2028年中国喷涂速凝橡胶行业市场调研分析及未来前景分析报告
- 解决LC_ALL: 无法改变区域选项 (UTF-8): 没有那个文件或目录的问题
- AI框架外部用户贡献代码
- dp,sp,px相互转化
- 2021年大数据常用语言Scala(八):基础语法学习 循环