一,什么是装饰器?

装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。

二,装饰器的形成过程。

现在我有一个需求,我想让你测试这个函数的执行时间,在不改变这个函数代码的情况下:

importtimedeffunc1():print('in func1')deftimer(func):definner():

start=time.time()

func()print(time.time() -start)returninner

func1=timer(func1)

func1()

装饰器---简单版

但是如果有多个函数,我都想让你测试他们的执行时间,你每次是不是都得func1 = timer(func1)?这样还是有点麻烦,因为这些函数的函数名可能是不相同,有func1,func2,graph,等等,所以更简单的方法,python给你提供了,那就是语法糖。

importtimedeftimer(func):definner():

start=time.time()

func()print(time.time() -start)returninner

@timer#==> func1 = timer(func1)

deffunc1():print('in func1')

func1()

装饰器---语法糖

刚刚我们讨论的装饰器都是装饰不带参数的函数,现在要装饰一个带参数的函数怎么办呢?

deftimer(func):definner(a):

start=time.time()

func(a)print(time.time() -start)returninner

@timerdeffunc1(a):print(a)

func1(1)

装饰器——带参数的装饰器

装饰器---带参数的装饰器

importtimedeftimer(func):def inner(*args,**kwargs):

start=time.time()

re= func(*args,**kwargs)print(time.time() -start)returnrereturninner

@timer#==> func1 = timer(func1)

deffunc1(a,b):print('in func1')

@timer#==> func2 = timer(func2)

deffunc2(a):print('in func2 and get a:%s'%(a))return 'fun2 over'func1('aaaaaa','bbbbbb')print(func2('aaaaaa'))

装饰器---hold住所有参数的装饰器

上面的装饰器已经非常完美了,但是有我们正常情况下查看函数信息的方法在此处都会失效:

defindex():'''这是一个主页信息'''

print('from index')print(index.__doc__) #查看函数注释的方法

print(index.__name__) #查看函数名的方法

如何解决呢?

from functools importwrapsdefdeco(func):

@wraps(func)#加在最内层函数正上方

def wrapper(*args,**kwargs):return func(*args,**kwargs)returnwrapper

@decodefindex():'''哈哈哈哈'''

print('from index')print(index.__doc__)print(index.__name__)

三,开放封闭原则。

1.对扩展是开放的

为什么要对扩展开放呢?

我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

2.对修改是封闭的

为什么要对修改封闭呢?

就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

装饰器完美的遵循了这个开放封闭原则。

四,装饰器的主要功能和固定结构。

deftimer(func):def inner(*args,**kwargs):'''执行函数之前要做的'''re= func(*args,**kwargs)'''执行函数之后要做的'''

returnrereturn inner

装饰器的固定格式

from functools importwrapsdefdeco(func):

@wraps(func)#加在最内层函数正上方

def wrapper(*args,**kwargs):return func(*args,**kwargs)return wrapper

装饰器的固定格式--wraps版

五,带参数的装饰器。

假如你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?

一个一个的取消掉? 没日没夜忙活3天。。。

过两天你领导想通了,再让你加上。。。

defouter(flag):deftimer(func):def inner(*args,**kwargs):ifflag:print('''执行函数之前要做的''')

re= func(*args,**kwargs)ifflag:print('''执行函数之后要做的''')returnrereturninnerreturntimer

@outer(False)deffunc():print(111)

func()

带参数的装饰器

六,多个装饰器装饰一个函数。

defwrapper1(func):definner():print('wrapper1 ,before func')

func()print('wrapper1 ,after func')returninnerdefwrapper2(func):definner():print('wrapper2 ,before func')

func()print('wrapper2 ,after func')returninner

@wrapper2

@wrapper1deff():print('in f')

f()

多个装饰器装饰一个函数

python 装饰器有哪些_python之装饰器相关推荐

  1. python中的类装饰器应用场景_Python 自定义装饰器使用写法及示例代码

    1.Python装饰器简介 python的装饰器就是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.简单的说装饰器就是一个用来返回函数 ...

  2. python装饰器的顺序_python中装饰器的装饰顺序和执行顺序

    在python语言中"装饰器"模式被设计成语言内置的设计模式,使得使用该模式变得简单,仅仅需要在目标函数前使用'@'符号加装饰器名就能达到目的.但如果同一个目标函数需要进行多次装饰 ...

  3. python中装饰器的作用_Python中装饰器的用法

    装饰器的作用 当我们需要为函数拓展新的功能,但是又不能修改函数的内部结构时,就可以通过装饰器来完成.通过装饰器为函数拓展功能符合"对于扩展是开放的,对于修改是封闭的"这一开闭原则. ...

  4. python装饰器与闭包_Python:函数装饰器和闭包

    摘自<流畅的python> 7.1 装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用 ...

  5. python闭包函数使用教程_Python闭包装饰器使用方法汇总

    闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...

  6. python装饰器返回值_Python之装饰器

    定义:装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. 应用场景:比如插入日志.性能测试.事务处理.缓存.权限校验 ...

  7. python中的json函数_python中装饰器、内置函数、json的详解

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...

  8. python常用的装饰器有哪些_python基本装饰器

    #基本代码: import time def decoratorrunlog_args(logval): print("logval is runing"+str(logval)) ...

  9. python装饰器的案例_Python之装饰器的实例

    def say_hi(func): def wrapper(*args,**kwargs): print('hi') ret = func(*args,**kwargs) print('bye') r ...

最新文章

  1. 安装discuz遇到的坑
  2. SATA硬盘如何使用GHOST
  3. php输出pre自动换行,解决 html pre 标签的内容自动换行的问题
  4. Powershell基础(一)
  5. java异常大全,如何处理异常,如何自定义异常
  6. linux定时器回调处理过程,Linux内核系统定时器TIMER实现过程分析
  7. JAVAAPI学习之Calendar类;Calendar类set()、add()、roll()方法区别
  8. 关于miniconda的安装,配置以及包批量安装和使用
  9. 操作需要计算机管理员权限,win10系统操作文件时提示需要管理员权限的处理教程...
  10. linux 指定库名 登录mysql_linux终端mysql用户操作只看这篇够了
  11. 毕业了5年的同学突然告诉我,他已经是架构师了!
  12. 流行的后台管理系统模板总结
  13. 安卓基于图像识别和CNN做出一个通用的斗地主记牌器(一)
  14. 英文论文sci参考文献格式
  15. 你想成为什么级别的程序员?
  16. webpack bable
  17. 程序员漫画-加油啊!
  18. 运动场球具的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  19. 博瑞云音箱云喇叭开发文档API接口文档开发指南(21-12-20)
  20. 微型计算机中读写速度最快的是,下列存储器中读写速度最快的是______.DOC

热门文章

  1. Nginx server_name正则表达式匹配配置
  2. Spring5的集成测试
  3. 收货地址 - 删除收货地址
  4. 权限操作-表结构分析与创建表
  5. Redis实现分布式锁原理SetNx命令
  6. java调用存储过程之环境测试
  7. 设计模式之_Iterator_03
  8. ios键盘横屏_iOS横竖屏旋转及其基本适配方法 转
  9. c++随机打乱数组_NumPy数组基本介绍
  10. 210312阶段三通过sqlite3源码安装sqlite3