Python的装饰器
Python中装饰器语法纪录:
装饰器的作用是,在不改变现有代码的结构的基础上,增加新的功能,号称'切面需求'。
一个例子说明:
业务中有一个msg()函数:
def msg(): print 'hello everyone'
现由于需求有变,需要纪录每个函数的执行日志。
正常的逻辑是:在原来的msg()中加入打印日志的内容,如下:
def msg(): logging.warn('%s is running' % func.__name__) print 'hello everyone'
这样的话就改变了原函数结构。并且,如果函数非常多,就需要在每个函数中都添加。这样就造成了大量的雷同代码。
为解决以上问题,python引入了装饰器语法:
import logging def useLog(func): def wrapper(): logging.warn("%s is running" % func.__name__) return func() # 把 msg 当做参数传递进来时,执行func()就相当于执行msg() return wrapper def msg(): print'hello everyone' #原函数不变 msg = useLog(msg) # 因为装饰器 useLog(msg) 返回的是函数对象 wrapper,这条语句相当于 msg = wrapper msg() # 执行msg()就相当于执行 wrapper()
以上:定义了一个useLog()函数,该函数接受一个函数作为参数,内嵌wrapper()函数。
msg=useLog(msg):
useLog(msg)返回wrapper,即msg=wrapper。
userLog()函数如下:
def useLog(msg): def wrapper(): logging.warn("%s is running" % func.__name__) return msg() # 把 msg 当做参数传递进来时,执行func()就相当于执行msg() return wrapper
msg():
由于msg=wrapper,调用msg()函数即调用wrapper()函数。由于上面useLog(msg)的调用,wrapper()函数如下:
def wrapper(): logging.warn("%s is running" % func.__name__) return msg()
即,执行logging方法打印运行日志,并且调用执行msg()函数。