码迷,mamicode.com
首页 > 编程语言 > 详细

Python # 装饰器

时间:2017-09-15 01:54:42      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:对象   wrapper   cti   __name__   ndt   地方   logs   注意   python   

###

现在我有一个简单的myfunc函数,现在我想对myfunc函数增加功能。下面我们增加一个deco的功能。

import time
def deco(func):
    startTime = time.time()
    func()
    endTime = time.time()
    msecs = (endTime - startTime)
    print("-->elapsed time %s s"%msecs)

def myfunc():
    print(start myfunc)
    time.sleep(3)
    print(end myfunc)

deco(myfunc)

但是这种方式存在一个问题,修改了myfunc的原来的调用方式:myfunc() ------> 变成了 deco(myfunc)。所以我们做了下面的改变。

###

def deco(func):
    def wrapper():
        startTime = time.time()
        func()
        endTime = time.time()
        msecs = (endTime - startTime)
        print("-->elapsed time %s s"%msecs)
    return wrapper                            ###返回的是<function deco.<locals>.wrapper at 0x03234468> 可以通过wrapper()调用

def myfunc():
print(‘start myfunc‘)
time.sleep(3)
print(‘end myfunc‘)

print("myfunc is %s"%myfunc.__name__ )
myfunc=deco(myfunc)
print("myfunc is %s"%myfunc.__name__ )
myfunc()

输出结果:

myfunc is myfunc
myfunc is wrapper
start myfunc
end myfunc
-->elapsed time 3.0007433891296387 s

经过了上面的改动后,一个比较完整的装饰器(deco)就实现了,装饰器没有影响原来的函数,以及函数调用的代码。

例子中值得注意的地方是,Python中一切都是对象,函数也是,所以代码中改变了”myfunc”对应的函数对象。

###

def deco(func):
    def wrapper():
        startTime = time.time()
        func()
        endTime = time.time()
        msecs = (endTime - startTime)
        print("-->elapsed time %s s"%msecs)
    return wrapper

@deco
def myfunc():
    print(start myfunc)
    time.sleep(3)
    print(end myfunc)


myfunc()

###

Python # 装饰器

标签:对象   wrapper   cti   __name__   ndt   地方   logs   注意   python   

原文地址:http://www.cnblogs.com/lwsup/p/7523582.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!