装饰器

1.装饰器是在不改变原函数的执行的情况下为原函数增额外的功能。

简单版装饰器
import time
def func1():
print('执行速度')
def timmer(f):
start_time=time.time()
f()
time.sleep(0.3)
end_time=time.time()
print('此函数的执行效率%s'% (end_time-start_time))
f1=func1
func1=timmer
func1(f1)
import time
def timmer1(f): #f接收的是@timmer下面原函数的函数名func1
def inner():
f()
start_time=time.time()
time.sleep(0.3)
end_time=time.time()
print('此函数的执行效率%s' % (end_time - start_time))
return inner @timmer1
def func1():
print('测试速度') func1() 执行结果:
测试速度
此函数的执行效率0.30037736892700195

2.被装饰函数带参数的装饰器

# import time
# def timmer(f):#f=func1=inner
# def inner(*args,**kwargs):
# start_time=time.time()
# f(*args,**kwargs) #func1((*args,**kwargs))
# time.sleep(0.3)
# end_time=time.time()
# print('此函数的执行效率%s'% (end_time-start_time))
# return inner
# @timmer
# def func1(a,b,c,d): #timmer(func1)
# print(a,b,c,d)
# print('测试效率')
# func1(1,2,3,4)

3.装饰器模版

def wrapper(func):
def inner(*args,**kwargs):
ret=func(*args,**kwargs)
return ret
return inner @wrapper
def func(a,b):
print(666)
func(1,2,3)

4.带参数的装饰器

import time
def timmer(*args,**kwargs):
def wrapper(f):
def inner(*args,**kwargs):
if flag:
start_time=time.time()
ret=f(*args,**kwargs)
time.sleep(0.3)
end_time=time.time()
print('此函数的执行效率%f' %(end_time-start_time))
else:
ret=f(*args,**kwargs)
return ret
return inner
return wrapper
flag=True #flag=False 关掉装饰器
@timmer(flag) # 两步:1.把timmer(flag)当成一个普通话函数传给def timmer(),返回wrapper 2.变成@wrapper装饰器
def func1():
print(666)
func1() 执行结果:
666
此函数的执行效率0.300240

5.多个装饰器

def wrapper1(func):# func=f=inner1
def inner1():
print('wrapper1,before func') #2
func()
print('wrapper1,after func') #3
return inner1
def wrapper2(func): # func=inner1=inner2
def inner2():
print('wrapper2,before func') #1
func()
print('wrapper2,after func') #4
return inner2
@wrapper2 # f = wrapper2(f) 里面的f==inner1 外面的f == inner2
@wrapper1 # f = wrapper1(f) 里面的f==函数名f 外面的f == inner1
def f():# f=inner1
print('in f')
f() #f=inner1=inner2 执行结果:
wrapper2,before func
wrapper1,before func
in f
wrapper1,after func
wrapper2,after func

最新文章

  1. Windows Server 2008 R2常规安全设置及基本安全策略
  2. background-size
  3. 配置Hadoop开发环境(Eclipse)
  4. mysql -B 恢复与不加
  5. 【工作记录】c#操作win7注册表
  6. javascripct字符串
  7. Android 三档自定义滑动开关,禁止点击功能的实现,用默认的seekbar组件实现
  8. Windows Phone 之手势识别(Flick)
  9. android 自定义圆形进度条
  10. CSS 文章段落样式
  11. jquery删除未来项 jquery on
  12. MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询
  13. BZOJ4805: 欧拉函数求和(杜教筛)
  14. Tuple Class
  15. laravel框架实现数据的删除和修改
  16. SSM_CRUD新手练习(8)搭建BootStrap分页页面
  17. imx6 lvds0 lvds1 display
  18. WIN32编程经验总结
  19. 50、多线程创建的三种方式之实现Runnable接口
  20. MySQL数据库事务各隔离级别加锁情况--Repeatable Read && MVCC(转)

热门文章

  1. JWT原理及实现
  2. SSM实现支付宝支付
  3. Rust学习(一)
  4. Keil MDK STM32系列(九) 基于HAL和FatFs的FAT格式SD卡TF卡读写
  5. 【刷题-PAT】A1101 Quick Sort (25 分)
  6. C++ 基本类型的大小
  7. MobaXterm中文乱码问题
  8. CSS设置标签、图片放大、缩小、旋转、移动(tranform)
  9. gorm链接mysql的初始化配置和连接池的使用
  10. Java多线程专题4: 锁的实现基础 AQS