PYTHON 函数装饰器

来源:互联网 发布:休闲食品淘宝店铺运营 编辑:程序博客网 时间:2024/05/05 20:09

    装饰器其实也就是一个函数,一个用来包装函数的函数,参数为被包装的函数,装饰器在函数申明完成的时候被调用,调用之后申明的函数被换成一个被装饰器装饰过后的函数。

    示例一:被包装函数就可接收任意形式的参数

#coding:utf-8:
from time import ctime,sleep

def main():
    for i in range(4):
        sleep(1)
        myList = func(i)
        print myList

def decofunc(fp):
    def _d(*arg, **karg):
        print "do sth before fp.."
        r= fp(*arg, **karg)
        print "do sth after fp.."
        return r
    return _d

@decofunc
def func(n):
    return [x **2 for x in range(n)]
if __name__ == '__main__':
    main()

执行后输出结果为:

>>> 
do sth before fp..
do sth after fp..
[]
do sth before fp..
do sth after fp..
[0]
do sth before fp..
do sth after fp..
[0, 1]
do sth before fp..
do sth after fp..
[0, 1, 4]
>>> 


示例二:装饰器带参数:再包装一层

#coding:utf-8:
def main():
    f()
    print "-"*20
    f2(1)
    print "-"*20
    f2(a=1,b=4)

def d(a):
    def _d(fp):
        def __d(*arg, **karg):
            print a
            print "do sth before fp.."
            r= fp(*arg, **karg)
            print "do sth after fp.."
            return r
        return __d
    return _d

@d("haha")
def f():
    print "call f"
@d("hehe")
def f2(a, b=2):
    print "call f2"
    print a+b

if __name__ == '__main__':
    main()

执行结果如下:

>>> 
haha
do sth before fp..
call f
do sth after fp..
--------------------
hehe
do sth before fp..
call f2
3
do sth after fp..
--------------------
hehe
do sth before fp..
call f2
5
do sth after fp..
>>> 

转载自 http://zhidao.baidu.com/link?url=3sJPRqkECozDZ9ROT5uB-_2C-pucr_e9_Uo9ugpUII7_gaiaWbj5xFv7L3nhC_pD_099VuXzV_nIrrTXNth4xa

0 0
原创粉丝点击