要想了解装饰器首先要了解闭包。
闭包:由外部函数与内部函数组成,内部函数通过调用外部函数的变量与返回内部函数的引用形成闭包。如下代码(因为本人使用的是python2.7的版本所以内部函数使用外部函数的变量时使用的是mutable对象(可变对象,列表或者字典)对象。python3与python2的区别参见博客:http://www.jb51.net/article/78955.htm)
def outer():
count= [0]
def inner():
count[0] +=1
print(count[0])
return inner
上述例子中实现了一个函数调用功能自动加1的功能。结果如下:
if __name__ =='__main__':
a= outer()
a() //输出1
a() //输出2
装饰器就是通过闭包来给原有函数增加新功能。例如我们通过给调用函数增加显示调用次数的功能。
def outer(func):
count= [0]
def inner(a,b):
count[0] +=1
print(count[0])
return func(a,b)
return inner
def add(a,b):
print("a + b value is %s" % (a+b))
return
if __name__ =='__main__':
a= outer(add)
a(2,3)
//1
// a + b value is 5
a(3,4)
//2
//a + b value is 7
a = outer(add)
,则def outer(func)
中的func = add
outer
函数 返回的是内部函数的引用,所以a = inner(a,b)
inner
函数返回的为func(a,b)
,所以 a= add(a,b)
在inner return func(a,b)
前可以增加任意操作哟。
有些人认为这样a = outer(add)
不美观,所以引用了语法糖,在需要添加功能的函数前加上 @outer
即可:
def outer(func):
count= [0]
def inner(a,b):
count[0] +=1
print(count[0])
return func(a,b)
return inner
@outer
def add(a,b):
print("a + b value is %s" % (a+b))
return
if __name__ =='__main__':
add(2,3)
//1
// a + b value is 5
add(3,4)
//2
//a + b value is 7