python 的装饰器(Decorator)能够在不改变原有代码结构的同时,添加诸如:日志记录,性能测试,事务处理,缓存等功能。
首先举个例子,比如一个函数,我们要在它执行的时候记录一条日志:
import time
def now():
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
logging.info(‘func now() is running’) #记录日志代码
上例中,我们在now函数中新增了 logging.info 用于记录日志,如果其他函数需要类似的功能,还需要在其他函数中添加相应的 logging 方法,这种做法对于代码的结构有影响, 并且当面对众多有类似需求的函数时,工作量会增大,代码冗余度高。接下来使用 装饰器 进行改造
import time
def log(func):
def wrapper(*args, **kw):
print('func %s() is running' % func.__name__)
return func(*args, **kw)
return wrapper
@log
def now():
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
@ 符号是 装饰器的语法糖, 把定义好的装饰器通过@符号放在需要记录日志的函数定义前,这样在调用now 函数时就会自动执行 log 函数,log 函数是我们之前了解过的高阶函数,它接收函数作为参数。通过内部的 wrapper 函数,调用 func 并返回结果。
网友评论