修饰器用来包装函数,增加额外的功能,而且应能够修饰一批函数,减少代码重用。
简单的修饰器
一个函数接收函数对象作为参数,并且返回函数对象,这样的函数可以成为一个修饰器,形如下面的定义:
代码语言:javascript复制def deco(func):
def _deco(*args):
print "do something"
func(*args)
return _deco
上面的修饰器中,func称为被修饰的函数,在执行func前做一些额外的初始化工作。
修饰器定义完成后,使用@去修饰函数,如下面所示:
代码语言:javascript复制@deco #实际相当于执行了f = deco(f)
def f(x):
print x
经过上述处理后,查看f的函数名已经变成了“_deco”
代码语言:javascript复制print f
print deco(f)
运行结果是:
<function _deco at 0x00000000022314A8> <function _deco at 0x0000000002231518>
说明修饰完成后,f是deco(f)的浅复制版本。
接着,当我们调用f("hello")时,将会得到下面的输出:
do something hello
带参数的修饰器
修饰器是一个函数形式,当然可以传入参数,此时,必须多加一层嵌套用来接收参数,如下:
代码语言:javascript复制def deco_args(a, b): # a,b是修饰器需要的参数
def deco(func):
def _deco(*args): # *args是被包裹的函数需要的参数
print "do something"
func(*args)
#do something
return _deco
return deco # 此处需闭包
@deco_args(1,2) # 相当于f = deco_args(1,2)(f)
def f(x):
print x