python装饰器简单理解
装饰器定义:1、把一个函数名当作实参传给另外一个函数(在不修改装饰函数源代码的情况下为其添加功能)
2、返回值中包含函数名(不改变函数调用方式)
源代码:
1 def f(): 2 def f(): 3 time.sleep(2) 4 print('i am f') 5
加基本计算程序运行时间函数
1 def f(): 2 print('i am f') 3 time.sleep(2) 4 def my_time(): 5 s_time = time.time() 6 f() 7 e_time = time.time() 8 print("消耗了%s秒"%(e_time - s_time)) 9 my_time()
1 #把func函数传入 2 def f(): 3 print('i am f') 4 time.sleep(2) 5 def my_time(func): #传入函数 6 s_time = time.time() 7 f() #打印函数 8 e_time = time.time() 9 print("%s消耗了%s秒"%(func.__name__,e_time - s_time)) 10 my_time(f) #
但调用时需用my_time来调用,而不能修改调用方式,思路就是可以把my_time下的定义为一个函数,再把它返回(return wrapper) 1 def f():
1 import time 2 def f(): 3 print('i am f') 4 time.sleep(2) 5 def my_time(func): #传入函数 my_timer(f) func = f 6 def wrapper(): 7 s_time = time.time() 8 #f() #打印函数 代码错了啊,这里应该要改为func(), 9 func() 10 e_time = time.time() 11 print("%s消耗了%s秒"%(func.__name__,e_time - s_time)) 12 return wrapper #返回这个函数的内存地址 13 n = my_time(f) #相当于执行my_time函数,该函数返回指向了wrapper,相当于执行了wrapper(),而wrapper就开始执行时间啊,打印这些 14 f = n 15 f()
理解上述的return wrapper:返回的是func的内存,即 f函数的内存地址
print(my_time(f)) 输出的是wrapper的内存地址 表示return返回的地址
定义一个外函数,让内函数进行返回 所以就有 外return,外return的是这个函数的返回值,而不是函数运行结果
@my_time #等价于f = my_time(f)
加要求,添加一个log函数,且要在时间函数前
1 import time 2 def log(func): 3 def wrapper(): 4 print('it is a log') 5 func() 6 #把函数执行结果返回,不然不会运行my_time里函数 7 return wrapper # 8 def my_time(func): 9 def wrapper(): 10 s_time = time.time() 11 func() 12 e_time = time.time() 13 print('耗时:%s'%(e_time - s_time)) 14 return wrapper 15 @log 16 @my_time 17 def f(): 18 time.sleep(2) 19 print('i am f') 20 f()
函数是从里到外装
如果源代码有return值
1 def my_time(func): 2 def wrapper(): 3 s_time = time.time() 4 func() 5 e_time = time.time() 6 print('耗时:%s'%(e_time - s_time)) 7 return wrapper 8 @my_time 9 def f(): 10 time.sleep(2) 11 return('i am f') 12 n = f() 13 print(n) 14 15 #output: 16 耗时:2.001243829727173 17 None
改进:
1 def my_time(func): 2 def wrapper(): 3 s_time = time.time() 4 temp = func() 5 e_time = time.time() 6 print('耗时:%s'%(e_time - s_time)) 7 return temp # 8 return wrapper 9 @my_time 10 def f(): 11 time.sleep(2) 12 return('i am f') 13 n = f() 14 print('n =',n)output:
耗时:2.000271797180176
n = i am f
能看到就是多了一个内return,return做的是把返回值带入原函数加返回值的话,return func()就是把func()的返回值返回
就要在打印时也要把返回值打印出来,所以就有了内return 只是把返回值return
源程序带有一个或多个参数
1 def my_time(func): 2 def wrapper(*args,**kwargs): 3 s_time = time.time() 4 temp = func(*args,**kwargs) 5 e_time = time.time() 6 print('耗时:%s'%(e_time - s_time)) 7 return temp 8 return wrapper 9 @my_time 10 def f(x,y): 11 return x,y 12 n = f('大哥','是我') # 13 print('n =',n)
这样输入带有参数的,就会正常返回多个参数
转载于:https://www.cnblogs.com/ilovelh/p/10250168.html
python装饰器简单理解相关推荐
- python装饰器简单理解_python装饰器的简单理解
如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你 ...
- python装饰器简单理解的小demo
def multi_100(func):def demo(ls):# 这个函数是让列表前两个元素*100for i in range(2):ls[i] = (ls[i] * 100)func(ls)r ...
- Python装饰器通俗理解
Python装饰器简单来讲就是用于扩展函数功能的一种工具,在扩展功能方面其与类的继承有些相似,都是为了提高代码的复用性.举个例子就是把孙悟空塞入炼丹炉,然后就出来一个还是会吃桃子会耍金箍棒,但是有火眼 ...
- python装饰器实例-Python装饰器简单用法实例小结
本文总结分析了Python装饰器简单用法.分享给大家供大家参考,具体如下: 装饰器在python中扮演着很重要的作用,例如插入日志等,装饰器可以为添加额外的功能同时又不影响业务函数的功能. 比如,运行 ...
- python装饰器-如何理解Python装饰器?
我从以下几点,由浅入深详细讲解一下Python装饰器:什么事装饰器? 为什么用装饰器? 在哪里用装饰器? 然后以示例+讲解相结合的方式阐述,同时会讲解一些在很多教程和书籍中不会涉及到的内容. 什么是P ...
- python装饰器哪个好_[Python] 对 Python 装饰器的理解心得
最近写一个py脚本来整理电脑中的文档,其中需要检校输入的字符,为了不使代码冗长,想到使用装饰器. 上网搜索有关python的装饰器学习文档,主要看的是AstralWind的一篇博文,以及Limodou ...
- python装饰器作用-理解python中的装饰器
一 什么是装饰器? 正如其名,装饰器的作用是为已经存在的对象增加额外功能(装饰),由此可使已有函数在无需代码改动的情况下增加额外功能:装饰器的本质是嵌套的函数且返回函数对象,即闭包.有关闭包的概念,可 ...
- python 装饰器简单笔记(附 *args **kw)
1. 装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. 现在,假设我们要增强函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改函数的定义,这种在代码 ...
- python装饰器副作用_对Python 装饰器的理解心得
0x00000000030A40D0位置(这个位置应该是指内存位置)存有一个function(方法)叫target:在 target后面加上(),表示调用该方法,即输入target(),"大 ...
最新文章
- AI+Science 是人类两大科研范式的结合,工程化正当时
- 从jquery源码中学习一些技巧
- SQLServer数据库自增长标识列的更新修改操作
- Swift之深入解析如何自定义操作符
- 简单实现顶部固定,中部自适应布局
- 05_视图控制器_1
- 若依如何降低mysql驱动版本?
- javascript中使用 闭包重载函数,记录日志功能
- Unity教程之-Unity3d中针对Android Apk的签名验证(C#实现)
- 我从佛学里悟到的自由
- MATLAB读取MIT心电信号
- 计算机系统导论(持续更新)
- 微信、支付宝、百度(drawImage及canvasGetImageData、支付宝(getImageData))踩坑,uni-app 获取图片底色像素值
- 无线网络打印机服务器安装步骤,网络打印机安装步骤
- vuejs --- 父组件向子组件传值(父传子)
- el-form的入门学习
- 【HTML5 基础】HTML5重要内容
- 基于 React hooks + Typescript + Cesium 实现泛光尾迹线
- 车载系统ce和linux,车载电子操作系统:QNX与Linux未来有望两家独大
- Visual Studio 2017, 2019 官网下载地址
热门文章
- 怎么用python运行代码_python怎么运行代码程序
- 时隔6年,“三巨头”再度联手,发布万字长文:深度学习将通往何方?
- 2021年斯坦福AI指数报告重磅出炉!中国AI期刊影响力首超美国,视频处理是新风口
- 以假乱真的“人造脸”,能骗过面部识别吗?
- 报告:AI技术正有效缩小亚洲医疗发展的差距
- 机器学习系列14:偏差与方差
- 深度学习:自然语言处理(五)NLTK的经典应用
- 披上AI战衣的中国APP,正在让印度节节败退
- 搜狗CEO王小川:AI领域存在泡沫 但留下的是珍珠
- 国内丨中国人工智能标准化体系建设提速