1、什么是装饰器?
#在不改变原函数的调用的情况下,为原函数增加一些额外的功能,打印日志,执行时间,登录认证
2、装饰器的形成过程
# 需求写一个函数测试另一个函数的执行效率
最初的实现方式,但是改变了函数的调用方式,需要改进
def timer(f1):
start_time = time.time()
f1()
end_time = time.time()
print(end_time- start_time)
timer(func1)
改进后调用方式基本相似,但是多加了两行代码
def timer(f1):
start_time = time.time()
f1()
end_time = time.time()
print(end_time- start_time)
f = func1
func1 = timer
func1(f) #== timer(func1)
最优的方法
def timer(f1):
def inner():
start_time = time.time()
f1()
end_time = time.time()
print(end_time - start_time)
return inner
func1 = timer(func1) #做下关系转换
func1()
通过python提供的语法塘实现装饰器
def timer(f1):
def inner():
start_time = time.time()
f1()
end_time = time.time()
print(end_time - start_time)
return inner
@timer == func1 = timer(func1)
def func1():
print("晚上回去吃烧烤")
time.sleep(0.3)
@timer == func2 = timer(func2)
def func2():
print("晚上回去和啤酒")
time.sleep(0.3)
func1()
func2()
# 装饰器传参
def timer(f1):
def inner(*args, **kwargs):
start_time = time.time()
f1(*args, **kwargs)
end_time = time.time()
print(end_time - start_time)
return inner
@timer #== func1 = timer(func1)
def func1(a, b):
print("晚上回去吃烧烤")
time.sleep(0.3)
@timer #== func2 = timer(func2)
def func2(a, b):
print("晚上回去和啤酒")
time.sleep(0.3)
func1(111,222) #参数首先传到inner()函数 *args,然后在传到f1()函数中
func2(222,333)
# 函数返回值
def timer(f1):
def inner(*args, **kwargs):
start_time = time.time()
ret = f1(*args, **kwargs)
end_time = time.time()
print(end_time - start_time)
return ret
return inner
@timer #== func1 = timer(func1)
def func1(a, b):
print("晚上回去吃烧烤")
time.sleep(0.3)
return 666
ret = func1(1, 2)
print(ret)
装饰器的写法规范
def wrapper(f1):
def inner(*args, **kwargs):
执行函数之前的操作
ret = f1() #返回值
执行函数之后的操作
return ret
return inner