装饰器定义: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装饰器简单理解相关推荐

  1. python装饰器简单理解_python装饰器的简单理解

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你 ...

  2. python装饰器简单理解的小demo

    def multi_100(func):def demo(ls):# 这个函数是让列表前两个元素*100for i in range(2):ls[i] = (ls[i] * 100)func(ls)r ...

  3. Python装饰器通俗理解

    Python装饰器简单来讲就是用于扩展函数功能的一种工具,在扩展功能方面其与类的继承有些相似,都是为了提高代码的复用性.举个例子就是把孙悟空塞入炼丹炉,然后就出来一个还是会吃桃子会耍金箍棒,但是有火眼 ...

  4. python装饰器实例-Python装饰器简单用法实例小结

    本文总结分析了Python装饰器简单用法.分享给大家供大家参考,具体如下: 装饰器在python中扮演着很重要的作用,例如插入日志等,装饰器可以为添加额外的功能同时又不影响业务函数的功能. 比如,运行 ...

  5. python装饰器-如何理解Python装饰器?

    我从以下几点,由浅入深详细讲解一下Python装饰器:什么事装饰器? 为什么用装饰器? 在哪里用装饰器? 然后以示例+讲解相结合的方式阐述,同时会讲解一些在很多教程和书籍中不会涉及到的内容. 什么是P ...

  6. python装饰器哪个好_[Python] 对 Python 装饰器的理解心得

    最近写一个py脚本来整理电脑中的文档,其中需要检校输入的字符,为了不使代码冗长,想到使用装饰器. 上网搜索有关python的装饰器学习文档,主要看的是AstralWind的一篇博文,以及Limodou ...

  7. python装饰器作用-理解python中的装饰器

    一 什么是装饰器? 正如其名,装饰器的作用是为已经存在的对象增加额外功能(装饰),由此可使已有函数在无需代码改动的情况下增加额外功能:装饰器的本质是嵌套的函数且返回函数对象,即闭包.有关闭包的概念,可 ...

  8. python 装饰器简单笔记(附 *args **kw)

    1. 装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. 现在,假设我们要增强函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改函数的定义,这种在代码 ...

  9. python装饰器副作用_对Python 装饰器的理解心得

    0x00000000030A40D0位置(这个位置应该是指内存位置)存有一个function(方法)叫target:在 target后面加上(),表示调用该方法,即输入target(),"大 ...

最新文章

  1. AI+Science 是人类两大科研范式的结合,工程化正当时
  2. 从jquery源码中学习一些技巧
  3. SQLServer数据库自增长标识列的更新修改操作
  4. Swift之深入解析如何自定义操作符
  5. 简单实现顶部固定,中部自适应布局
  6. 05_视图控制器_1
  7. 若依如何降低mysql驱动版本?
  8. javascript中使用 闭包重载函数,记录日志功能
  9. Unity教程之-Unity3d中针对Android Apk的签名验证(C#实现)
  10. 我从佛学里悟到的自由
  11. MATLAB读取MIT心电信号
  12. 计算机系统导论(持续更新)
  13. 微信、支付宝、百度(drawImage及canvasGetImageData、支付宝(getImageData))踩坑,uni-app 获取图片底色像素值
  14. 无线网络打印机服务器安装步骤,网络打印机安装步骤
  15. vuejs --- 父组件向子组件传值(父传子)
  16. el-form的入门学习
  17. 【HTML5 基础】HTML5重要内容
  18. 基于 React hooks + Typescript + Cesium 实现泛光尾迹线
  19. 车载系统ce和linux,车载电子操作系统:QNX与Linux未来有望两家独大
  20. Visual Studio 2017, 2019 官网下载地址

热门文章

  1. 怎么用python运行代码_python怎么运行代码程序
  2. 时隔6年,“三巨头”再度联手,发布万字长文:深度学习将通往何方?
  3. 2021年斯坦福AI指数报告重磅出炉!中国AI期刊影响力首超美国,视频处理是新风口
  4. 以假乱真的“人造脸”,能骗过面部识别吗?
  5. 报告:AI技术正有效缩小亚洲医疗发展的差距
  6. 机器学习系列14:偏差与方差
  7. 深度学习:自然语言处理(五)NLTK的经典应用
  8. 披上AI战衣的中国APP,正在让印度节节败退
  9. 搜狗CEO王小川:AI领域存在泡沫 但留下的是珍珠
  10. 国内丨中国人工智能标准化体系建设提速