文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Python decorator学习

Python decorator学习

时间:2010-03-12  来源:pgt112you

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
相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载