一、定义:
装饰器实际上是为了给某程序添加功能,但是有的应用程序已经上线或被使用,那么大批量的直接修改源码是不合适的,也是不科学的,于是就产生了装饰器,其满足:
1、不修改被装饰函数的源代码;
2、不修改被装饰函数的的执行过程;
3、在其原来代码的基础上添加新的逻辑判断或处理。
二、不带参数的装饰器:
1、添加打印时间任务:
import time
def stringToUper(func): # 接收原函数
def wrap(*args,**kwargs):
start=time.time()
func(args) # 调用原函数
print(time.time()-start) # 统计函数运行时间
return wrap
@stringToUper # 装饰的函数
def main(lst):
time.sleep(1) # 设置休息时间,防止代码运行太快,时间太短。
for l in lst: # 循环遍历结果
print(l)
main('abcdefg') # 调用函数
2、修改原参数:
import time
def stringToUper(func):
def wrap(*args,**kwargs):
start=time.time()
args=''.join([arg.upper() for arg in args]) # 修改原参数,把参数都改为大写
func(args)
print(time.time()-start)
return wrap
@stringToUper
def main(lst):
time.sleep(1)
for l in lst:
print(l)
main('abcdefg')
三、带参数的装饰器:
1、单个参数的装饰器:
import time
def stringToUper(params): # 接收参数
def function(func):
def wrap(*args,**kwargs):
start=time.time()
func(params) # 利用装饰器将原函数的参数修改为接收的新参数
print(time.time()-start)
return wrap
return function
@stringToUper('hijklmn') # 传递参数
def main(lst):
time.sleep(1)
for l in lst:
print(l)
main('abcdefg')
2、多个参数的装饰器:
import time
def stringToUper(*params): # 接收多个参数
def function(func):
def wrap(*args,**kwargs):
start=time.time()
for x in (params): # 遍历多个参数,调用原函数
func(x)
print(time.time()-start)
return wrap
return function
@stringToUper('www','yyy') # 传递多个参数
def main(lst):
time.sleep(1)
for l in lst:
print(l)
main('abcdefg')
四、继承多个装饰器
def func1(func):
print('func1')
def warp(*args,**kwargs):
print('func1:main function')
func(*args,**kwargs)
return warp
def func2(func):
print('func2')
def warp(*args,**kwargs):
print('func2:main function')
func(*args,**kwargs)
return warp
@func1
@func2
def prints():
print('main function')
prints()
执行流程:
1、事先把所有的函数和变量都定义完,装饰器执行顺序:fun2 ->func1, 函数关联完此时已经打印完了func2、func1。
2、当真正执行prints()函数的时候,函数就从里往外执行:func1 -> func2,故结果为: