Python学习之装饰器
装饰器的形成过程
不修改函数的调用方式,但是还想在原来的函数前后添加功能
import time
#装饰带参数函数的装饰器
def timer(f): # 计算函数的执行时间
def inner(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs) # 被装饰的函数
end = time.time()
print(end - start)
return ret
return inner
@timer # 语法糖 @装饰器函数名 等价于 func = timer(func)
def func(a,b): # 被装饰的函数
print('大家好',a,b)
time.sleep(0.01)
return '你好'
ret = func(1,b=2) # 实际执行了inner()
print(ret)
timer就是一个装饰器函数,只是对一个函数有一些装饰作用
原则:开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的
装饰器的固定模式
def wrapper(f): # 装饰器函数
def inner(*args,**kwargs):
'''在被装饰器函数之前想要的操作'''
ret = f(*args,**kwargs) # 被装饰的函数
'''在被装饰器函数之后想要的操作'''
return ret
return inner
带参数的装饰器
import time
FLAGE = True
def timer_out(flag):
def timer(f): # 计算函数的执行时间
def inner(*args, **kwargs):
if flag:
start = time.time()
ret = f(*args, **kwargs) # 被装饰的函数
end = time.time()
print(end - start)
return ret
else:
ret = f(*args, **kwargs)
return ret
return inner
return timer
@timer_out(FLAGE)
def wahaha():
time.sleep(0.1)
print('哈哈哈')
@timer_out(FLAGE)
def er():
time.sleep(0.1)
print('666')
wahaha()
er()