Chinaunix首页 | 论坛 | 博客
  • 博客访问: 126359
  • 博文数量: 67
  • 博客积分: 1510
  • 博客等级: 上尉
  • 技术积分: 680
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-29 11:22
文章分类

全部博文(67)

文章存档

2011年(10)

2010年(28)

2009年(29)

我的朋友
最近访客

分类: Python/Ruby

2010-03-12 13:40:44

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
阅读(642) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~