一、简单的装饰器

1.为什么要使用装饰器呢?

  装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

  装饰器的本质:就是一个闭包函数

那么我们先来看一个简单的装饰器:实现计算每个函数的执行时间的功能

 1 import time
 2 def  wrapper(func):
 3         def inner():
 4               start=time.time()
 5               func()
 6               end=time.time()
 7               print(end-start)
 8         return inner
 9
10 def  hahaha():
11         time.sleep(1)
12         print('aaaaa')
13 hahaha=wrapper(hahaha)
14 hahaha()    

简单的装饰器

上面的功能有点不简介,不完美,下面就引进了语法糖。

 1 import time
 2 def wrapper(func):
 3         def inner():
 4                start=time.time()
 5                func()
 6                end=time.time()
 7                print(end-start)
 8         return inner
 9 @wrapper
10 def  kkk():#相当于kkk=wrapper(kkk)
11     print('aaaaa')
12 kkk()             

装饰器-------语法糖

以上的装饰器都是不带参数的函数,现在装饰一个带参数的该怎么办呢?

原函数带一个参数的装饰器

 1 import time
 2 def timer(func):
 3     def inner(*args,**kwargs):
 4         start = time.time()
 5         re = func(*args,**kwargs)
 6         end=time.time()
 7         print(end- start)
 8         return re
 9     return inner
10
11 @timer   #==> func1 = timer(func1)
12 def func1(a,b):
13     print('in func1')
14     print(a,b)
15
16 @timer   #==> func1 = timer(func1)
17 def func2(a):
18     print('in func2 and get a:%s'%(a))
19     return 'fun2 over'
20
21 func1(1,2)
22 print(func2('aaaaaa'))

原函数带多个参数的装饰器

 1 import time
 2 def timer(func):
 3     def inner(*args,**kwargs):
 4         start = time.time()
 5         re = func(*args,**kwargs)
 6         end=time.time()
 7         print(end - start)
 8         return re
 9     return inner
10
11 @timer   #==> func1 = timer(func1)
12 def jjj(a):
13     print('in jjj and get a:%s'%(a))
14     return 'fun2 over'
15
16 jjj('aaaaaa')
17 print(jjj('aaaaaa'))

带返回值的装饰器

二、开放封闭原则

1.对扩展是开放的

2.对修改是封闭的

 三、装饰器的固定结构

 1 import time
 2 def wrapper(func):  # 装饰器
 3     def inner(*args, **kwargs):
 4         '''函数执行之前的内容扩展'''
 5         ret = func(*args, **kwargs)
 6          '''函数执行之前的内容扩展'''
 7         return ret
 8     return inner
 9
10 @wrapper  # =====>aaa=timmer(aaa)
11 def aaa():
12     time.sleep(1)
13     print('fdfgdg')
14 aaa()

View Code

 四、带参数的装饰器

带参数的装饰器:就是给装饰器传参

        用处:就是当加了很多装饰器的时候,现在忽然又不想加装饰器了,想把装饰器给去掉了,但是那么多的代码,一个一个的去闲的麻烦,那么,我们可以利用带参数的装饰器去装饰它,这就他就像一个开关一样,要的时候就调用了,不用的时候就去掉了。给装饰器里面传个参数,那么那个语法糖也要带个括号。在语法糖的括号内传参。在这里,我们可以用三层嵌套,弄一个标识为去标识。如下面的代码示例

 1 # 带参数的装饰器:(相当于开关)为了给装饰器传参
 2 # F=True#为True时就把装饰器给加上了
 3 F=False#为False时就把装饰器给去掉了
 4 def outer(flag):
 5     def wrapper(func):
 6         def inner(*args,**kwargs):
 7             if flag:
 8                 print('before')
 9                 ret=func(*args,**kwargs)
10                 print('after')
11             else:
12                 ret = func(*args, **kwargs)
13             return ret
14         return inner
15     return wrapper
16
17 @outer(F)#@wrapper
18 def hahaha():
19     print('hahaha')
20
21 @outer(F)
22 def shuangwaiwai():
23     print('shuangwaiwai')
24
25 hahaha()
26 shuangwaiwai()

给装饰器加参数

 五、多个装饰器装饰一个函数

 1 def qqqxing(fun):
 2     def inner(*args,**kwargs):
 3         print('in qqxing: before')
 4         ret = fun(*args,**kwargs)
 5         print('in qqxing: after')
 6         return ret
 7     return inner
 8
 9 def pipixia(fun):
10     def inner(*args,**kwargs):
11         print('in qqxing: before')
12         ret = fun(*args,**kwargs)
13         print('in qqxing: after')
14         return ret
15     return inner
16 @qqqxing
17 @pipixia
18 def dapangxie():
19     print('饿了吗')
20 dapangxie()
21
22 '''
23 @qqqxing和@pipixia的执行顺序:先执行qqqxing里面的 print('in qqxing: before'),然后跳到了pipixia里面的
24         print('in qqxing: before')
25         ret = fun(*args,**kwargs)
26         print('in qqxing: after'),完了又回到了qqqxing里面的 print('in qqxing: after')。所以就如下面的运行结果截图一样
27 '''

多个装饰器装饰一个函数

上例代码的运行结果截图

六、统计多少个函数被装饰了的小应用

 1  统计多少个函数被我装饰了
 2 l=[]
 3 def wrapper(fun):
 4     l.append(fun)#统计当前程序中有多少个函数被装饰了
 5     def inner(*args,**kwargs):
 6         # l.append(fun)#统计本次程序执行有多少个带装饰器的函数被调用了
 7         ret = fun(*args,**kwargs)
 8         return ret
 9     return inner
10
11 @wrapper
12 def f1():
13     print('in f1')
14
15 @wrapper
16 def f2():
17     print('in f2')
18
19 @wrapper
20 def f3():
21     print('in f3')
22 print(l)

统计多少个函数被装饰了

python-------装饰器相关推荐

  1. python简单装饰器_简单介绍Python装饰器(一)

    装饰器的作用 相信大家在 探索过程中已经了解装饰器的作用,也有很多花里胡哨的介绍. 这次小冰也来讲解一下关于Python装饰器的一些小知识. 它的作用: 性能测试 日志 安全验证 ...... 相信大 ...

  2. Python装饰器的神奇功能:自动打印每个方法耗时

    问题: 运行代码时,尤其对于大型项目需要分析每个环节方法耗时的.每个方法前后都写计算耗时及日志打印太繁琐了,而且代码不精简. 解决: Python装饰器类似于Spring的 AOP(Aspect Or ...

  3. python装饰器教学_Python装饰器学习(九步入门)

    这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次 ...

  4. 简单介绍python装饰器

    这篇文章简单介绍一下python装饰器,希望对你们有所帮助. 简单正常python例子: def up(text):return text.upper() #转成大写 def lo(text):ret ...

  5. Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能

    Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能 目录

  6. python 装饰器示例

    python 装饰器示例 import timedef decorator(func): # 传函数def wrapper(*args, **kwargs): # 传参数(也可以传固定参数)start ...

  7. [转]python 装饰器

    以前你有没有这样一段经历:很久之前你写过一个函数,现在你突然有了个想法就是你想看看,以前那个函数在你数据集上的运行时间是多少,这时候你可以修改之前代码为它加上计时的功能,但是这样的话是不是还要大体读读 ...

  8. python装饰器与闭包_Python 装饰器和闭包

    Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...

  9. 利用世界杯,读懂 Python 装饰器

    Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性, 熟练掌握装饰器会让你的编程思路更加宽广,程序也更加 pythonic. 今天就结合最近的世界杯带大家理解下装饰器. 德 ...

  10. Python 装饰器记录总结 (终极版)

    Python 装饰器记录总结 (终极版) 原文链接:http://magicroc.com/2017/04/10/Python装饰器记录总结/ 装饰器是一个函数,一个用来包装函数的函数,装饰器在函数申 ...

最新文章

  1. pandas使用dropna函数删除dataframe中列非缺失值的个数小于某一比例阈值的数据列
  2. CentOS 7环境安装Docker
  3. 软件工程导论 银行储蓄系统_银行计算机储蓄系统
  4. t4b代码生成_用T4模板实现简单的代码生成器
  5. 中间件——构筑复杂分布式应用的关键技术(转)
  6. ES6新特性_ES6中Map的介绍与API---JavaScript_ECMAScript_ES6-ES11新特性工作笔记032
  7. 【Python】keras使用Lenet5识别mnist
  8. 关于嵌入式系统的启动
  9. matlab iradon函数详解,如何处理iradon函数所得图像
  10. 计算机组成原理试题解析答案,计算机组成原理习题答案解析(蒋本珊)
  11. 51单片机点亮数码管,单片机学习的好的办法,单片机例子大全,单片机教程
  12. 铁威马NAS搭建邮件服务器教程
  13. BZOJ 4008: [HNOI2015]亚瑟王
  14. 在Textview中获取指定文字位置(兼顾网址链接和emoji表情),并在其附近展示图片
  15. 关于函数凹凸性两种定义与二阶导数符号之间的联系证明
  16. 计算机谈音乐少年,听音乐起鸡皮疙瘩?你可能真的是天赋异禀的少年
  17. 小游戏内测激励视频广告,然而小程序最大的潜力是电商
  18. Hypervisor介绍(二)
  19. 计算机系统结构的分类-复杂指令集系统CISC与精简指令集系统RISC
  20. 批处理获取系统安装时间/系统开机时间/电脑唤醒时间及开机使用时间(二)完成

热门文章

  1. MyBatis中提示:You have an error in your SQL syntax; check the manual that corresponds to your MySQL ser
  2. 简单两个命令快速使用Xshell从Linux服务器上下载上传文件
  3. 交互式计算机图形学总结:第一章 图形系统和模型
  4. oracle 存储过程 输入,Oracle 存储过程加密方法
  5. 直播预告丨爆款独立站如何利用数据提升经营效率?
  6. 白皮书下载 |《产品用户体验的数据化评估》
  7. 用户太多太杂,搞不懂怎么办?“分门别类”将拯救你
  8. Spring Cloud:使用Ribbon实现负载均衡详解(下)
  9. springboot添加swagger2组件
  10. nodejs链接kafka示例(producer、consumer)