#-*- 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
#2014年08月11日20:33:50更新
#最后怎么为装饰器函数传递参数呢
#假设有一个函数adeco能返回itmeit5,adeco可以接受任意参数;就能实现为装饰器传递参数的功能
def adeco(arg):
print 'input0 %s' % arg #1
def timeit5(func):
print 'input1 %s' % arg #2
@functools.wraps(func)
def wrapper(*args,**kwargs):
print 'input2 %s' % arg #3
start = time.clock()
ret = func(*args,**kwargs)
end = time.clock()
print 'used:',end-start
return ret
return wrapper
return timeit5
#调用代参数的装饰器
@adeco('arg') #相当于调用了adeco函数,那么#1 #2处的代码在定义是就执行了;只有#3处的代码是在运行是执行的,所以对arg的运算应该在wrapper函数中执行
def sub(x,y):
return x-y
理解python装饰器
最新推荐文章于 2022-05-23 22:10:45 发布