装饰器形成的过程

装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后加功能

原则:开发封闭原则

开发:对扩展是开发的

封闭:对修改是封闭的

装饰器的固定模式

计算运行时间

 1 import time
 2 # time.time()获取当前时间
 3 # time.sleep(5)让程序在执行到这个位置的时候停一会儿
 4
 5
 6 def timer(f):#func地址 ;装饰器函数
 7     #闭包
 8     def inner():
 9         start=time.time()
10         ret=f()#被装饰的函数
11         end=time.time()
12         print(end-start)
13         return ret
14     return inner
15 @timer    #语法糖  @装饰器函数名
16 # func=timer(func)#就等于@timer
17 def func():#被装饰的函数
18 #     start=time.time()
19     print(1)
20     time.sleep(0.01)
21 #     end=time.time()
22 #     print(end-start)
23     return '新年好'
24 ret=func()#实际执行的是inner
25 print(ret)

timer就是一个装饰器函数,只是对一个函数有装饰作用

装饰带参数函数的装饰器

 1 #装饰带参数函数的装饰器
 2 import time
 3 def timer(f):#func地址 ;装饰器函数
 4     #闭包
 5     def inner(*args):
 6         start=time.time()
 7         ret=f(*args)#被装饰的函数
 8         end=time.time()
 9         print(end-start)
10         return ret
11     return inner
12 @timer    #语法糖  @装饰器函数名
13 def func(a):#被装饰的函数
14     print(1,a)
15     time.sleep(0.01)
16     return '新年好'
17 @timer    #语法糖  @装饰器函数名
18 def func1(a,b):#被装饰的函数
19     print(1,a,b)
20     time.sleep(0.01)
21     return '新年好'
22
23 ret=func1(1,2)#实际执行的是inner
24 ret1=func(1)
25 #func()#实际执行的是inner
26 print(ret)
27 print(ret1)

固定格式

def wrapper(f):#f被装饰的函数,wrapper就是装饰def inner(*args,**kwargs):#定义一个其他函数#在被装饰函数之前要做的事ret=f(*args,**kwargs)#被装饰的函数,被装饰的函数执行#在被装饰函数之后要做的事return retreturn inner#不加()

@wrapper    #语法糖  @装饰器函数名
def func1(a,b):#被装饰的函数time.sleep(0.01)print(1,a,b)return '新年好'

装饰器进阶

 1 def wrapper(func):  #func = holiday
 2     def inner(*args,**kwargs):
 3         print('在被装饰的函数执行之前做的事')
 4         ret = func(*args,**kwargs)
 5         print('在被装饰的函数执行之后做的事')
 6         return ret
 7     return inner
 8
 9 @wrapper   #holiday = wrapper(holiday)
10 def holiday(day):
11     '''这是一个放假通知'''
12     print('全体放假%s天'%day)
13     return '好开心'
14
15 print(holiday.__name__)

 1 # 装饰器进阶
 2     # functools wraps
 3 from functools import wraps
 4 def wrapper(func):#f被装饰的函数,wrapper就是装饰
 5     @wraps(func)#
 6     def inner(*args,**kwargs):
 7         print('在被装饰的函数执行之前做的事')
 8         ret = func(*args,**kwargs)
 9         print('在被装饰的函数执行之后做的事')
10         return ret
11     return inner
12 @wrapper    #语法糖  @装饰器函数名
13 def holiday(day):
14     '''这是一个放假通知'''
15     print('全体放假%s天'%day)
16     return '好开心'
17 print(holiday.__name__)
18 print(holiday.__doc__)
19 ret = holiday(3)   #inner
20 print(ret)
21     #带参数的装饰器
22 #   多个装饰器装饰同一个函数
23
24 # 函数名.__name__查看字符串格式的函数名
25 # 函数名.__name__#document查看函数的注释

 1 #带参数的装饰器
 2 #500个函数
 3 import time
 4 FLAGE = False
 5 def timmer_out(flag):
 6     def timmer(func):
 7         def inner(*args,**kwargs):
 8             if flag:
 9                 start = time.time()
10                 ret = func(*args,**kwargs)
11                 end = time.time()
12                 print(end-start)
13                 return ret
14             else:
15                 ret = func(*args, **kwargs)
16                 return ret
17         return inner
18     return timmer
19 # timmer = timmer_out(FLAGE)
20 @timmer_out(FLAGE)    #@timer #wahaha = timmer(wahaha)
21 def wahaha():
22     time.sleep(0.1)
23     print('wahahahahahaha')
24
25 @timmer_out(FLAGE)
26 def erguotou():
27     time.sleep(0.1)
28     print('erguotoutoutou')
29 wahaha()
30 erguotou()

#多个装饰器装饰一个函数
def wrapper1(func):def inner1():print('wrapper1 ,before func')ret = func()print('wrapper1 ,after func')return retreturn inner1def wrapper2(func):def inner2():print('wrapper2 ,before func')ret = func()print('wrapper2 ,after func')return retreturn inner2def wrapper3(func):def inner3():print('wrapper3 ,before func')ret = func()print('wrapper3 ,after func')return retreturn inner3@wrapper3
@wrapper2
@wrapper1
def f():print('in f')return '哈哈哈'print(f())#记录用户的登录情况
#计算这个函数的执行时间

转载于:https://www.cnblogs.com/xk66d/p/10822318.html

python之函数三装饰器相关推荐

  1. python find函数_Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案

    本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群. Python 装饰器简介 装饰器(Decorator)是 Python 非常实用的一个语法糖功能.装饰器本质是一种返回值也是函数的函数,可以称之 ...

  2. python log函数_python装饰器的使用

    1. 装饰者模式 装饰者模式是常用的软件设计模式之一.通过此设计模式,我们能够在不修改任何底层代码情况下,给已有对象赋予新的职责.python中可以用装饰器简单地实现装饰者模式. 1.1 将函数作为参 ...

  3. python魔法函数和装饰器_python魔法方法、构造函数、序列与映射、迭代器、生成器...

    在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法. 构造函数 构造函数不同于普通方法,将 ...

  4. python 二——函数、装饰器、生成器、面向对象编程(初级)

    本节内容 1.函数 2.装饰器 3.生成器 4.类 一.函数 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强... ...

  5. python基础-函数之装饰器、迭代器与生成器

    1. 函数嵌套 1.1 函数嵌套调用 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数 def bar():print("from in the bar.")def foo ...

  6. what's the python之函数及装饰器

    what's the 函数? 函数的定义:(return是返回值,可以没有,不过没有的话就返回了None) def wrapper(参数1,参数2,*args,默认参数,**kwargs):'''注释 ...

  7. python wraps函数_python装饰器---@wraps

    BEGIN: python装饰器 装饰器(Decorators)是Python的一个重要部分.简单地说:装饰器是修改其他函数的功能的函数.他们有助于让我们的代码更简短,也更Pythonic(Pytho ...

  8. python中高阶函数和装饰器_三.Python高阶函数和装饰器

    1高阶函数 1.1 数学概念回顾下数学知识: y=f(x) 这是最开始接触的普通函数 y=g(f(x)) 这个就是我们接触到的高阶函数 在数学和计算机科学中,高阶函数至少应当是满足下面一个条件的函数: ...

  9. python高阶函数闭包装饰器_Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)...

    一,装饰器 装饰器:本质就是函数,功能是为其它的函数动态添加附加的功能 原则:对修改关闭对扩展开放 1.不修改被修饰函数的源代码 2.不修改被修改函数的调用方式 装饰器实现的知识储备:高阶函数,函数嵌 ...

最新文章

  1. ODOO权限管理,在两个方面设置权限
  2. 使用IRP进行文件操作
  3. tomcat 随windows启动
  4. 信息检索报告_读者信息素养状况问卷调查分析报告来啦
  5. tmpfs加速并降低squid负载(一)
  6. php curl模拟https请求
  7. 公众号发布代码最好的工具markdown语法
  8. 蔚来召回4803辆ES8电动汽车 自燃原因找到了?
  9. 文本获取和搜索引擎中的反馈模型
  10. 如何区分家里的网线是超五类还是超六类的呢?
  11. centos终止linux程序,CentOS启动和停止服务详解
  12. 在一堆人还在犹豫《SEO实战密码》是否值得购买的时候,在下已经收藏了1/10的签名版...
  13. 运算符——Python
  14. css clear属性 的深入了解
  15. 用java中的map解析微信MicroMsg里的CompatibleInfo.cfg和systemInfo.cfg
  16. win7系统修复工具_win7系统如何修复
  17. 用深度学习创作艺术绘画
  18. Spring简述以及AOP、IOC
  19. C++ vector 标准差
  20. python能代替matlab吗_MATLAB替代软件 - 老牛博客

热门文章

  1. openresty 前端开发序
  2. ref和out 传递参数(C#)
  3. 新年新技术:MongoDB 3.0
  4. 使用 acl 库编写发送邮件的客户端程序
  5. pfile和spfile的区别
  6. ARM的位置无关程序设计在Bootloader中的应用
  7. 给Sqlite数据库设置密码
  8. Java Robot对象实现服务器屏幕远程监视
  9. 新手怎么学以太坊区块链开发?
  10. 如何使用日志进行程序调试_如何使用日志节省调试时间