想要增强函数的功能,但是又不希望修改函数的定义。这种代码运行期间动态增加功能的方式,称之为装饰器。
从本质上来说,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()函数内,首先打印日志,再紧接着调用原始函数。
装饰器模式跟字面意思一样,相当于给函数加了 一个装饰