python装饰器

因为函数是一个对象,而且函数对象可以被复制给变量,所以通过变量也可以调用函数

我们要在原代码上动态添加功能的方式就叫装饰器

本质上,装饰器就是一个返回函数的告诫函数。我们现在定义一个打印体制的

比如说我现在定义一个函数,实现以下的功能

>>> 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的文本

原文地址:https://www.cnblogs.com/smail-bao/p/5730285.html