代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)
本质上,decorator就是一个返回函数的高阶函数
所以,我们要定义一个能打印日志的decorator,可以定义如下:
import time
def log(func):
def wrapper(*args, **kargs):
print('call %s():' % func.__name__)
return func(*args, **kargs)
return wrapper
#观察上面的log
,因为它是一个decorator,所以接受一个函数作为参数,并返回一个函数。我们要借助Python的@语法,把decorator置于函数的定义处:
@log
def now():
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))
now()
调用now()
函数,不仅会运行now()
函数本身,还会在运行now()
函数前打印一行日志:
1 call now(): 2 2018-08-13 11:08:45
把@log
放到now()
函数的定义处,相当于执行了语句:
1 now = log(now)