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()函数。

 

posted @ 2017-03-16 16:08  ahaii  阅读(185)  评论(0编辑  收藏  举报