day 12 python的装饰器
1·装饰器
①装饰器的作用:在不改变函数的基础上,在函数的前后添加新的功能
②使用原则:开放封闭原则(开放:对扩展时开放的;封闭:对修改是封闭的)
2·语法糖:@装饰函数
3·本节涉及的库:time (import time)
print(time.tim())#获取当前时间
print(time.sleep(时间间隔)) #让程序在执行到这里的时候停一会儿s
装饰器的固定模式:
例:
import time
def timmer(f): #装饰器函数 ,f为被装饰函数
def inner( ):
start = time.time()
ret = f( )
end = time.time()
return ret
return inner
@timmer #语法糖,装饰器函数的调用方法 func= timmer(func)-->inner
def func(): #被装饰函数
time.sleep(0.1)
print('博主真帅!')
return '无与伦比'
带有参数的装饰器函数:
import time
def timmer(f): #装饰器函数
def inner(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs)
end = time.time()
return ret
return inner
@timmer #语法糖,装饰器函数的调用方法 func= timmer(func)-->inner
def func(a,b): #被装饰函数
time.sleep(0.1)
print('博主真帅!')
return '无与伦比'
需要理解装饰函数的在程序中的执行顺序:
装饰器的进阶:(函数的停止调用,及三层函数)
当存在多个参数时,500个函数的时候,如何停止函数的调用
import time
flage = True
def wrapper(flage):
def timmer(f):
def inner(*args,**kwargs):
if flage:
start =time.time()
ret = f(*args,**kwargs)
end = time.time()
print(end-start)
return ret
else:
ret = f(*args,**kwargs)
print(‘函数在这里:’)
return inner
return timmer
@wrapper(flage) #相当于wrapper(flage) = timmer,先执行wrapper(),再调用函数timmer
def func(a.c):
rtime.sleep(0.3)
print('11')
func(1,2)
多个函数装十一个函数:
def wrapper1(f):#f =func
def inner1():
print('wrapper1 after om func')
ret = f()
print('wrapper1 after om func')
return inner1
def wrapper2(f): #f=inner1
def inner2():
print('wrapper2 after om func')
ret = f()
print('wrapper2 after om func')
return inner2
def wrapper3(f): #f =inenr2
def inner3():
print('wrapper3 after om func')
ret = f()
print('wrapper3 after om func')
return inner3
@wrapper3 #func =wrapper3(func)=wrappr3(func) = inner3
@wrapper2 #func =wrapper2(func)= wrapper2(inner1) = inner2
@wrapper1 #func = wrapper1(func)-->inner1
#三个装饰器的使用顺序,先执行最接近被装饰的那个装饰器
def func():
print('niubi')
func() #-->inner3()-->inner2()-->inner1()
#应用:
可应用于记录用户的来访情况
计算这个函数的执行时间