20190325——Python装饰器

想要增强函数的功能,但是又不希望修改函数的定义。这种代码运行期间动态增加功能的方式,称之为装饰器。

从本质上来说,decorator就死一个返回函数的高阶函数,所以,我们要定义一个打印日子的decorator,定义如下:

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

观察上面的log,因为它是一个decorator,所以接受一个函数作为参数,并返回一个函数。我们要借助Python的@语法,把decorator置于函数的定义处:

@log
def now():
    print('2015-3-25')

把@log放到now()函数的定义处,相当于执行了语句:

now = log(now)

由于log是一个decorator,返回一个函数,所以原来的now函数依然还在,只是现在同名的now变量指向了新的函数,于是调用now()将执行函数,即在log()函数中返回的wrapper函数
wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。

装饰器模式跟字面意思一样,相当于给函数加了 一个装饰

猜你喜欢

转载自blog.csdn.net/qq_36344771/article/details/88801954