#装饰器形成的过程(执行原来的函数但不改变原来的函数内容,又能添加新的功能)
#timer就是一个装饰器函数,只是对一个函数有一些装饰作用
import time
def timer(f):#1 装饰器函数
def inner():#4
start = time.time()#7
f()#8 被装饰的函数
end = time.time()#11
print(end - start)#12
return inner#5
def func():#2
time.sleep(0.01)#9
print('大家好!')#10
func = timer(func)#3
func()#6
1.装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后添加功能)
2.@装饰器名字用法(实现与上一样的功能)
import time
def timer(f):#1 装饰器函数
def inner():#4
start = time.time()#7
f()#8 被装饰的函数
end = time.time()#11
print(end - start)#12
return inner#5
@timer #语法糖(@timer == func = timer(func)#3) @装饰器函数
def func():#2
time.sleep(0.01)#9
print('大家好!')#10
#func = timer(func)#3
func()#6
3.被修饰函数有返回值
import time
def timer(f):#1 装饰器函数
def inner():#4
start = time.time()#7
ret = f()#8 被装饰的函数
end = time.time()#11
print(end - start)#12
return ret
return inner#5
@timer #语法糖(@timer == func = timer(func)#3) @装饰器函数
def func():#2
time.sleep(0.01)#9
print('大家好!')#10
return '新年好'
# func = timer(func)#3
retu = func()#6
print(retu)
4.被修饰函数带参数
import time
def timer(f):#1 装饰器函数
def inner(a):#4
start = time.time()#7
ret = f(a)#8 被装饰的函数
end = time.time()#11
print(end - start)#12
return ret
return inner#5
@timer #语法糖(@timer == func = timer(func)#3) @装饰器函数
def func(a):#2
time.sleep(0.01)#9
print('大家好!'+ a)#10
return '新年好'
# func = timer(func)#3
retu = func('同事好')#6
print(retu)
5.两种不同的传参方式
import time
def timer(f):#1 装饰器函数
def inner(*args,**kwargs):#4
start = time.time()#7
ret = f(*args,**kwargs)#8 被装饰的函数
end = time.time()#11
print(end - start)#12
return ret
return inner#5
@timer #语法糖(@timer == func = timer(func)#3) @装饰器函数
def func(a,b):#2
time.sleep(0.01)#9
print('大家好!',a,b)#10
return '新年好'
@timer
def func1(a):#2
time.sleep(0.01)#9
print('大家好!'+ a)#10
return '新年好'
retu = func(1,2)#6
print(retu)
retu1 = func(1,b = 2)
print(retu1)
6.原则:开放封闭原则
(1) 开放:对扩展是开放的
(2) 封闭: 对修改是封闭的
7.装饰器(wrapper)的固定模式
import time
def timer(f):#1 装饰器函数
def inner(*args,**kwargs):#4
'''在被装饰函数之前要做的事'''
ret = f(*args,**kwargs)#8 被装饰的函数
'''在被装饰函数之后要做的事'''
return ret
return inner#5
@timer #语法糖(@timer == func = timer(func)#3) @装饰器函数
def func(a,b):#2
time.sleep(0.01)#9
print('大家好!',a,b)#10
return '新年好'