1、装饰器最初的形成
import time
def timer(func): #timer是装饰器函数
def inner():
print(time.time())
func() #f是被装饰的函数
time.sleep(0.01)
print(time.time())
return inner
def fun():
print('哇哈哈哈ha')
fun=timer(fun)#把inner的内存地址赋值给变量fun
fun()
#装饰器的作用 —— 不想修改函数的调用方式 但是还想在原来的函数前后添加功能
#timer就是一个装饰器函数,只是对一个函数 有一些装饰作用
2、装饰器函数
import time
def timer(func): #timer是装饰器函数
def inner():
print(time.time())
func()
time.sleep(0.01)
print(time.time())
return inner
@timer #语法糖 @装饰器函数名
def fun():#f是被装饰的函数
print('哇哈哈哈ha')
#fun=timer(fun)#把inner的内存地址赋值给变量fun
fun()
3、带返回值的装饰器
def timmer(f): #装饰器函数
def inner():
start = time.time()
ret = f() #被装饰的函数
end = time.time()
print(end - start)
return ret
return inner
@timmer #语法糖 @装饰器函数名
def func(): #被装饰的函数
time.sleep(0.01)
print('老板好同事好大家好')
return '新年好'
#func = timmer(func)
ret = func() #inner()
print(ret)
#装饰带参数函数的装饰器
def timmer(f): #装饰器函数
def inner(*args,**kwargs):
#(1,2) /(1)
start = time.time()
ret = f(*args,**kwargs) #f(1,2) #被装饰的函数
end = time.time()
print(end - start)
return ret
return inner
@timmer #语法糖 @装饰器函数名
def func(a,b): #被装饰的函数
time.sleep(0.01)
print('老板好同事好大家好',a,b)
return '新年好'
@timmer #语法糖 @装饰器函数名
def func1(a): #被装饰的函数
time.sleep(0.01)
print('老板好同事好大家好',a)
return '新年好'
#func = timmer(func)
ret = func(1,2) #inner()
ret = func(1,b = 2) #inner()
print(ret)
4、装饰器的固定格式
def wrapper(f): #装饰器函数,f是被装饰的函数
def inner(*args,**kwargs):
'''在被装饰函数之前要做的事'''
ret = f(*args,**kwargs) #被装饰的函数
'''在被装饰函数之后要做的事'''
return ret
return inner
@wrapper #语法糖 @装饰器函数名
def func(a,b): #被装饰的函数
time.sleep(0.01)
print('老板好同事好大家好',a,b)
return '新年好'
总结
# 装饰器
# 开发原则 : 开放封闭原则
# 装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能
# 装饰器的本质 : 闭包函数
def wrapper(func):
def inner(*args,**kwargs):
print('在被装饰的函数执行之前做的事')
ret = func(*args,**kwargs)
print('在被装饰的函数执行之后做的事')
return ret
return inner
@wrapper #holiday = wrapper(holiday)
def holiday(day):
print('全体放假%s天'%day)
return '好开心'
ret = holiday(3)
print(ret)