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的解释(一看就懂)-- 并对装饰器详解相关推荐

  1. 一看就懂的i++和++i详解

    前言 转载请说明出处,本文来自Android菜鸟:https://blog.csdn.net/android_cai_niao/article/details/106027313 QQ:2717521 ...

  2. python ssl模块用法详解_一看就懂,Python 日志模块详解及应用!

    日志概述 百度百科的日志概述: Windows网络操作系统都设计有各种各样的日志文件,如应用程序日志,安全日志.系统日志.Scheduler服务日志.FTP日志.WWW日志.DNS服务器日志等等,这些 ...

  3. python alpha beta 剪枝_一看就懂的 Alpha-Beta 剪枝算法详解

    Alpha-Beta剪枝用于裁剪搜索树中没有意义的不需要搜索的树枝,以提高运算速度. 假设α为下界,β为上界,对于α ≤ N ≤ β: 若 α ≤ β  则N有解. 若 α > β 则N无解. ...

  4. 一看就懂的Alpha-Beta剪枝算法详解

    原贴:http://blog.csdn.net/tangchenyi/article/details/22925957 Alpha-Beta剪枝算法(Alpha Beta Pruning) [说明] ...

  5. 绿建科技加密图纸查看器安装_施工图看不懂?1.1G工程施工图纸详解,253页图文合集一查就清楚...

    施工图看不懂?1.1G工程施工图纸详解,253页图文合集一查就清楚 只要是对建筑行业,有所了解的朋友都清楚,钢筋施工图纸对于建筑物,有着举足轻重的地位!一点都不得马虎大意,接触建筑行业,第一步还是需 ...

  6. 教你看懂车牌号——全国车牌详解细表

    教你看懂车牌号--全国车牌详解细表 北京市(京)  A  B(出租车)  C  E  F  H  G(远郊区县)  天津市(津)  A  B  C  E(出租车)  河北省(冀)  A 石家庄市 B ...

  7. 联想微型计算机s5l5主板,看清再买! 笔记本保修条例详解 联想篇

    看清再买! 笔记本保修条例详解 联想篇 已经成为国际级企业的PC巨头联想在国内拥有非常高的知名度,尤其是今年以来,联想更是推出了多款设计非常优秀.外观非常漂亮的本本.对于消费者来说 (本文共1页) 阅 ...

  8. git合并分支——带图解释一看就懂版

    git合并分支(一看就懂) 首先,我们创建dev分支,然后切换到dev分支: $ git checkout -b dev Switched to a new branch 'dev' git chec ...

  9. 怎么查看笔记本内存条型号_笔记本配置参数怎么看 笔记本配置参数查看方法【详解】...

    在科技高速发展的时代,很多人都想拥有一台属于自己的电脑或者笔记本,在选购电脑或者笔记本时,我们总会面对一堆参数,虽然有些参数只要选数字大的准没错,但其具体代表什么意思,不少用户还真不知道,更不用说一些 ...

  10. CAD手机看图软件中多线段编辑详解

    很多人在使用CAD手机看图软件查看CAD图纸的过程中,有些时候需要对图纸中的多线段进行简单的编辑,这个时候该怎么操作呢?下面以浩辰CAD看图王手机版来给大家详细介绍一下CAD手机看图软件中多线段编辑的 ...

最新文章

  1. JS~字符串长度判断,超出进行自动截取(支持中文)
  2. 【深度学习】深入浅出数字图像处理基础(模型训练的先修课)
  3. python贴吧回帖-python控制浏览器爬取百度贴吧回复并写入Excel
  4. IIS Form 认证 保护HTML页面
  5. win7计算机管理找不到文件夹,Win7系统打开组策略提示找不到文件gpedit.msc怎么办...
  6. CF662C Binary Table(FWT)
  7. 前端开发 容器标签span与div 0228
  8. Android功耗优化(7)---如何分析wakelock(wakeup source)持锁问题
  9. 实验一 命令解释程序的编写
  10. c语言全民,C语言还有学习的必要吗
  11. BZOJ5092:[Lydsy1711月赛]分割序列(贪心,高维前缀和)
  12. RabbitMQ入门:发布/订阅(Publish/Subscribe)
  13. 王道计算机考研数据结构—学习笔记Chapter Five 串String
  14. 读史可以明智_为什么拥抱传统是明智的
  15. CSS特效三:简单的便签效果
  16. 100本最棒的web前端图书推荐
  17. 利用Google Map显示指定位置地理位置
  18. 阿里内部使用的12 款开发工具,很多人可能都没听过
  19. SpringSecurity-基于微服务的认证与权限访问
  20. 打成jar包 在命令行下执行java工程

热门文章

  1. sql特殊字符转义,oracle中将字符 ‘ 转义
  2. 2022-2028年中国自动驾驶系统行业现状调研分析报告
  3. 2022-2028年中国钢桶行业市场研究及前瞻分析报告
  4. libgstreamer-1.0.so.0: cannot open shared object file: No such file or directory
  5. 2022-2028年中国中密度纤维板市场投资分析及前景预测报告
  6. 2022-2028年中国喷涂速凝橡胶行业市场调研分析及未来前景分析报告
  7. 解决LC_ALL: 无法改变区域选项 (UTF-8): 没有那个文件或目录的问题
  8. AI框架外部用户贡献代码
  9. dp,sp,px相互转化
  10. 2021年大数据常用语言Scala(八):基础语法学习 循环