装饰器
装饰器是python的高级语法。它主要是用于对函数、方法或类进行加工包装。装饰器采用@语符号,语法简单,可读性高。
装饰器其实是一个函数,它接受函数、方法或类这些可调用对象(callable)作为参数,返回处理过的函数或类对象。当我们想对一个已经封装好的类或者函数添加其他的操作时可以考虑采用装饰器。
装饰函数和方法
1.不含参数的装饰器
首先,我们定义一个函数用于计算平方。
def add(a):
return a**2
print add(3)
有了基本功能后,我们希望添加其他功能,比如输出一句话。修改代码如下:
def add(a):
return a**3
def deco(fun):
def newFun(a):
print ('input :',a)
return fun(a)
return newFun
add = deco(add)
print add(3)
打印结果是:
input : 3
27
现在来分析下函数。
函数deco()接受一个函数fun作为参数,并在自己的函数体中定义一个新的函数newFun,在newFun中,首先增加功能打印信息,然后通过fun(a)调用原来的函数。最后将该新的函数对象返回:return newFun。
语句add = deco(add),首先调用deco(add)函数,然后将新的函数对象newFun返回。所以当调用add(3)的时候,实际上是调用函数newFun。
这样,我们清楚了,函数deco()作为装饰器对函数add()进行装饰。需要注意的是,装饰器deco()必须返回一个可调用对象,不然被装饰后的函数调用时就不知道调用什么了。
这时我们通过@装饰器实现上面的功能:
def deco(fun):
def newFun(a):
print'input :',a
return fun(a)
return newFun
@deco
def add(a):
return a**3
print add(3)
在函数add上面添加@deco即可。
2.含参装饰器
上面的装饰器默认其后的函数为唯一的参数,如果我们想传入其他的参数,需要在原来的装饰器外面再加一层函数。
def decoMaker(args):
def deco(fun):
def newFun(a):
print'args from decoration is ',args
print'input :',a
return fun(a)
return newFun
return deco
@decoMaker('^_^')
def add(a):
return a**3
print add(3)
需要注意的是,装饰器要返回可调用对象:return deco。可以对一个函数添加多个装饰器。
def decoMaker(args):
def deco(fun):
def newFun(a):
#函数执行体
print'args from decoration is ',args
print'input :',a
return fun(a)
return newFun
return deco
def decoMakerDoc(args):
def decoDoc(func):
if func.__doc__ == None :
printargs,func.__name__, "has no__doc__, it's a bad habit."
else:
print func.__name__, ':', func.__doc__, '.'
return func
return decoDoc
@decoMakerDoc('T_T')
@decoMaker('^_^')
def add(a):
"return a's power"
return a**3
print add(3)
这时,add = decoMakerDoc(‘T_T’)(decoMaker(‘^_^’)(add))