装饰器:本质就是函数,功能是为其他函数添加附加功能
原则:
1.不修改被修饰函数的源代码
2.不修改被修饰函数的调用方式
装饰器的知识储备
装饰器 = 高阶函数 + 函数调用 + 闭包
例:
原函数:
def test():
time.sleep(3)
print('测试完成')
test()
#测试完成
目标:
不改变原函数代码和调用方式的情况下,在结果处加上程序运行的时间。
构建装饰器:
def dec(func):
def dec_1():
start_time = time.time()
res = func()
stop_time = time.time()
print('程序运行时间%s' %(stop_time-start_time))
return res
return dec_1
此时我们只需要 dec(test) 就可以得到test函数的内存地址,然后运行即可
import time
def dec(func):
def dec_1():
start_time = time.time()
res = func()
stop_time = time.time()
print('程序运行时间%s' %(stop_time-start_time))
return res
return dec_1
def test():
time.sleep(3)
print('测试完成')
test = dec(test)
test() #这里将dec(test)赋值给test,然后test() 是为了不改变原函数的调用方式
#测试完成
#程序运行时间3.0002593994140625
这里我们不难发现,如果这样写的话,每一次我们使用装饰器都要加上 test = dec(test) 进行重新赋值。所以在这里我们可以使用一个简单的方法 就是 在原函数的前面加上 @dec ,它就相当于test = dec(test)。
import time
def dec(func):
def dec_1():
start_time = time.time()
res = func()
stop_time = time.time()
print('程序运行时间%s' %(stop_time-start_time))
return res
return dec_1
@dec
#test = dec(test)
def test():
time.sleep(3)
print('测试完成')
test()
#测试完成
#程序运行时间3.0002593994140625
完成