python的decorator有两种形式,分别是有参数的和没参数的。
没参数的:
@cloth
def test1(params):
有参数的:
@dress(10)
def test2(params):
使用decorator主要是为了在函数调用前和函数调用之后做一些处理。
decorator在定义被他修饰的函数的时候就会运行,而不是在调用被他修饰的函数的时候才会运行。如果是嵌套的decorator或者是带参数的decorator,他会一直运行,知道返回的函数式最后一层函数为止。
没有参数的decorator的调用顺序为:
@A
@B
@C
def f ():
最终python会处理为:
f = A(B(C(f)))
没有参数的decorator例子:
#coding:utf-8
def cloth(func):
print "in cloth"
def new_func(new_param):
print "in new_func"
temp = func(new_param+1)
return temp + 2
return new_func
#在此时cloth将会运行,他的func这个参数是test1这个函数。然后cloth将new_func返回去。
@cloth
def test1(params):
print "in test1"
return params + 3
if __name__ == "__main__":
#之前cloth返回来的new_func这个函数接受了5这个参数,即new_param是5。
#test1中的params是new_func函数调用它的时候,穿进去的值,在这里是new_param+1,即6。
#在new_func中调用的test1函数返回一个值(9),然后
#将这个值+2返回给了a。所以说相当于给啊赋值的是new_func。
print "aaaa"
a = test1(5)
print a
|
输出结果为:
in cloth
aaaa
in new_func
in test1
11
带有参数的decorator的调用顺序为:
@A(args)
def f ():
python会处理为:
def f(): …
_deco = A(args)
f = _deco(f)
带有参数的decorator的例子为:
def dress(param): #这里的param是@dress(10)中的10
print "in dress"
param = param + 1
def new_dec(func): #这相当于一个新的decorator,func是test2
print "in new_dec"
# param = param + 2 #在这里其实new_dec已经被dress返回了,所以param就成了未定义的了
def new_func(args): #这里的args是b = test2(5)中的5
print "in new_func"
return func(args) + 3
return new_func
return new_dec
#此时dress将会运行,因为@dress(10)有参数,所以传给dress的参数param是10。在dress中,做了一些处理之后将new_dec返回,这个new_dec是一个新的decorator。因为10这个参数是传给dress的,所以传给new_dec的参数是函数test2。然后new_dec再将new_func返回。
@dress(10)
def test2(params):
print "in test2"
return params + 3
if __name__ == "__main__": #new_dec中做了一些处理之后将new_func返回,new_func的args参数是b = test2(5)中的5。
#即new_func接受的5的参数,在new_func中可以调用test2这个函数做一些处理,也可以不调用。
#最后返回给b的值其实是new_func的返回值。
print "bbbb"
b = test2(5)
print b
|
输出结果为:
in dress
in new_dec
bbbb
in new_func
in test2
11
阅读(1341) | 评论(0) | 转发(0) |