背景
我刚开始接触python的时候就想着怎么实现java中注解(@语法)的方式写代码,毕竟这样在调用的时候真的很方便,于是我就在网上找了下发现在python中早就有这种方式了,这就是今天给大家分享的python装饰器@
从打印日志说起
日志功能很简单,就是记录下调用函数的名称,以及函数执行的时间,不使用装饰器的做法如下:
python
from time import time
# 定义log函数
def log(func):
start_time = time()
func()
end_time = time()
run_time = end_time - start_time
print('执行函数{}使用时长:{}'.format(func.__name__,run_time))
# 定义普通调用函数
def say():
print('hello,www.h3blog.com')
# 输出调用say的执行时间
log(say)
输出结果:
bash
hello,www.h3blog.com
执行函数say使用时长:3.337860107421875e-05
其实上面的方式是通过python闭包调用的
使用装饰器调用
python
from time import time
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args,**kwargs):
start_time = time()
ret = func(*args,**kwargs)
end_time = time()
run_time = end_time - start_time
print('执行函数{}使用时长{}'.format(func.__name__,run_time))
return ret
return wrapper
@log
def say():
print('hello,www.h3blog.com')
if __name__ == '__main__':
say()
终归起来python中的装饰器就是闭包回调函数的一次封装,而@语法糖也是为方便调用而设计的