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