目录
事发现场
这到底啥玩意啊哥,O.o?
简介
由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数.1
2
3
4
5
6def now():
print('2015-3-25')
...
f = now
f()
2015-3-25
函数对象有一个name属性:1
2
3
4 now.__name__
'now'
f.__name__
'now'
假设我们要增强now()
函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()
函数的定义,这种在代码运行期间动态增加功能的方式,称之为 “装饰器”(Decorator) 。
实例解析
本质上,decorator就是一个返回函数的高阶函数。log是一个能打印日志的函数1
2
3
4
5def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
上面的log函数接受一个函数作为参数,然会一个函数
执行代码:1
2
3
def now():
print('2015-3-25')
输出结果如下,我们可以看到在执行now
函数的同时页执行了log
函数1
2
3 now()
call now():
2015-3-25