理解python装饰器


#-*- coding: UTF-8 -*-

import time
import functools

def foo(say,hi='xx'):
    print locals()
    print 'in foo :say %s' % (say,)

def add(x,y):
    return x+y

#version 1
def timeit(func):
    start = time.clock()
    func()
    end = time.clock()
    print 'used:',end-start

#如果不改变foo的调用方式就需要 
#foo = timeit(foo) 
#version 2
def timeit2(func):
    def wrapper():
        start = time.clock()
        func()
        end = time.clock()
        print 'used:',end-start
    
    return wrapper

#需要考虑参数的问题
#version 3
def timeit3(func):
    def wrapper(*args,**kwargs):
        start = time.clock()
        func(*args,**kwargs)
        end = time.clock()
        print 'used:',end-start
    return wrapper

#返回值
def timeit4(func):
    def wrapper(*args,**kwargs):
        start = time.clock()
        ret = func(*args,**kwargs)
        end = time.clock()
        print 'used:',end-start
        return ret
    return wrapper

#让调用也方便
@timeit4
def sub(x,y):
    return x-y

#当我们使用sub.__name__的时候返回的是什么呢?
#'wrapper'
#这个明显不是我们需要的,functools.wraps就是来解决这个问题的

def timeit5(func):
    @functools.wraps(func)
    def wrapper(*args,**kwargs):
        start = time.clock()
        ret = func(*args,**kwargs)
        end = time.clock()
        print 'used:',end-start
        return ret
    return wrapper

@timeit5
def sub2(x,y):
    return x-y


相关内容

    暂无相关文章

评论关闭