Python装饰器

来源:互联网 发布:网页版流程图软件 编辑:程序博客网 时间:2024/06/08 08:33

转载地址:http://python.jobbole.com/82344/

1.>>原理:

[root@VM_131_54_centos opentsdb_script]# cat d.pyimport timedef deco(func):    start_time = time.time()    func()    end_time = time.time()    run_time = (end_time-start_time)    print run_timedef myfunc():    time.sleep(0.6)deco(myfunc)[root@VM_131_54_centos opentsdb_script]# python d.py0.600670099258##################################################+++++++++++++++++++++装饰器+++++++++++++++++[root@VM_131_54_centos opentsdb_script]# python dd.py0.600654125214[root@VM_131_54_centos opentsdb_script]# cat dd.pyimport timedef deco(func):    def wrapper():        start_time = time.time()        func()        end_time = time.time()        run_time = (end_time-start_time)        print run_time    return wrapperdef myfunc():    time.sleep(0.6)myfunc = deco(myfunc)myfunc()

函数名类似c中的指针。

2.>>语法糖

[root@VM_131_54_centos opentsdb_script]# python dd.py0.600659132004[root@VM_131_54_centos opentsdb_script]# cat dd.py import timedef deco(func):    def wrapper():        start_time = time.time()        func()        end_time = time.time()        run_time = (end_time-start_time)        print run_time    return wrapper@decodef myfunc():    time.sleep(0.6)myfunc()

使用了@装饰器名后,简洁了。

3.>>带参数

[root@VM_131_54_centos opentsdb_script]# cat dd.py import timedef deco(func):    def wrapper(a,b):        start_time = time.time()        func(a,b)        end_time = time.time()        run_time = (end_time-start_time)        print run_time    return wrapper@decodef myfunc(a,b):    print a,b    time.sleep(0.6)myfunc(1,3)[root@VM_131_54_centos opentsdb_script]# python dd.py 1 30.600697994232

4.>>双层装饰器。
调用顺序:

装饰器是可以叠加使用的,那么这是就涉及到装饰器调用顺序了。对于Python中的”@”语法糖,装饰器的调用顺序与使用 @ 语法糖声明的顺序相反。

可以根据结果看出:
先把myfunc用deco2进行装饰,装饰器返回的wrapper函数再被deco1装饰。所以不是myfunc(a,b)被执行两遍,而是只有一遍。

[root@VM_131_54_centos opentsdb_script]# python dd.py enter into deco1enter into deco21 30.6006619930270.60070681572[root@VM_131_54_centos opentsdb_script]# cat dd.py import timedef deco1(func):    def wrapper(a,b):        print "enter into deco1"        start_time = time.time()        func(a,b)        end_time = time.time()        run_time = (end_time-start_time)        print run_time    return wrapperdef deco2(func):    def wrapper(a,b):        print "enter into deco2"        start_time = time.time()                func(a,b)                end_time = time.time()                run_time = (end_time-start_time)                print run_time    return wrapper@deco1@deco2def myfunc(a,b):    print a,b    time.sleep(0.6)myfunc(1,3)



5.>>类装饰器:
待补全

6.>>内置装饰器:

在Python中有三个内置的装饰器,都是跟class相关的:staticmethod、classmethod 和property。staticmethod 是类静态方法,其跟成员方法的区别是没有 self 参数,并且可以在类不进行实例化的情况下调用classmethod 与成员方法的区别在于所接收的第一个参数不是 self (类实例的指针),而是cls(当前类的具体类型)property 是属性的意思,表示可以通过通过类实例直接访问的信息