装饰器作用——在不改变原函数的代码和调用方式的情况下,给函数添加功能
如下,有一个函数func()
def func():
print("执行开始")
print("执行结束")
现在,我们需要测试该函数执行所耗费的时间
如下
import time
def func():
print("执行开始")
print("执行结束")
starttime = time.time()
func()
endtime = time.time()
print("函数执行耗时:",endtime - starttime)
但在写项目的时候,我们不可能在每个函数执行的前后都加上上面的语句,所以我们需要将此功能写到函数的内部,让它执行一次就输出执行耗费的时间,如下:
import time
def func():
starttime = time.time()
print("执行开始")
print("执行结束")
endtime = time.time()
print("函数执行耗时:",endtime - starttime)
func()
现在,我们为这个函数加上了计时功能,但是当我们需要将很多函数都加上这个功能时,直接在函数体中写代码就会很麻烦了
这个时候,我们就会想到,在每个函数体中都加上计时功能就会使代码的重复率变得很高,这个时候,就应该用函数来进行代码的复用
import time
def func():
print("执行开始")
print("执行结束")
def test(func):
starttime = time.time()
func()
endtime = time.time()
print("函数执行耗时:",endtime - starttime)
test(func)
上面虽然解决了代码重复的问题,但是这样想要执行func()函数并且输出耗时,就必须使用test()
函数,这样就改变了函数的调用方式。想要不改变函数的调用方式,又要批量的给函数增加功能,就需要进行如下的改进了
import time
def func():
print("执行开始")
print("执行结束")
def test(func):
def f():
starttime = time.time()
func()
endtime = time.time()
print("函数执行耗时:",endtime - starttime)
return f
func = test(func)
func()
如上,将函数传入test中,test内的f函数就比func函数多了一个计时功能,然后将f函数返回,由func来接收,这样,就实现了功能的添加,只需为每个函数添加类似func = test(func)
的语句,就可以实现添加功能
python中,有专门的的语法来表示func = test(func)
,即在函数的定义前面添加@test
,如下
import time
def test(func):
def f():
starttime = time.time()
func()
endtime = time.time()
print("函数执行耗时:",endtime - starttime)
return f
@test #相当于func = test(func)
def func():
print("执行开始")
print("执行结束")
func()
此时@test
就成了一个装饰器了