Loading...

目录


事发现场

这到底啥玩意啊哥,O.o?


简介

由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数.

1
2
3
4
5
6
>>> def 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
5
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper

上面的log函数接受一个函数作为参数,然会一个函数

执行代码:

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

输出结果如下,我们可以看到在执行now函数的同时页执行了log函数

1
2
3
>>> now()
call now():
2015-3-25


参考链接