因为函数是一个对象,而且函数对象可以被复制给变量,所以通过变量也可以调用函数
我们要在原代码上动态添加功能的方式就叫装饰器
本质上,装饰器就是一个返回函数的告诫函数。我们现在定义一个打印体制的
比如说我现在定义一个函数,实现以下的功能
>>> def now():
... print "12-23-11"
...
上面的代码实现了打印日期的功能的功能
我现在想给他添加新功能。但是不能改变函数now()函数的定义。
我现在要给他添加一个打印日志的功能
例子如下
def log(func):
def wrapper(*args,**kw):
func()
print 'call %s'%func.__name__
return func(*args,**kw)
return wrapper
@log
def now():
print '2016-08-10'
now()
这里的@log放在最开始定义的函数now()处。相当于执行了now=log(now)。因为log()是一个装饰器,返回一个函数(对象),所以原来的now()函数仍然存在,只是在同名的now变量指向了新的函数,于是调用now()将执行新函数。即在log()函数中返回的wrapper()函数,也就是说调用now()函数执行wrapper()函数
上面我们在装饰器中定义了参数,但是我们没有传入参数。如果装饰器内需要传入参数的话。则这么写:
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print '%s %s():' % (text, func.__name__)
return func(*args, **kw)
return wrapper
return decorator
@log('hello')
def now():
print '2016-08-10'
now()
输出内容为
hello now():
2016-08-10
这里自定义log的文本