装饰器decorator
在python中所有东西都是对象(object)
在python中定义一个函数时,我们只是新建了一个变量,在变量里保存了一个函数对象(function object)
def get_mutiply_func(x):
def multoply(n):
return n*x
return multoply#此处返回的是一个函数并将x传入
a=get_mutiply_func(3)
b=get_mutiply_func(2)
print(a(3))#结果为9
print(b(3))#结果为6
decorate本身是一个collable(接口),也可以把它看作一个函数,@后面跟的就是一个函数名
decorate本身是一个输入输出都是函数的函数,(输入一定是函数,极端条件下输出不一定是函数)
接着是一个最简单的装饰器应用
def dec(f):
return 1
@dec
def double(x):
return x*2
print(double)#返回1
double=dec(double)#这就是装饰器的作用
import time
def timeit(f):
def wrapper(x):
start=time.time()
ret=f(x)
print(time.time()-start)
return ret
return wrapper
@timeit
def my_func(x):#相当于my_func=timeit(my_func(x))
time.sleep(x)
my_func(1)
import time
def timeit(f):
def wrapper(x):
start=time.time()
ret=f(x)
print(time.time()-start)
return ret
return wrapper
@timeit
def myfunc(x):
time.sleep(x)
@timeit
def otherfunc(x):
return x**2
print(otherfunc(2))#返回运行时间和4
可以传入多个参数的
import time
def timeit(f):
def wrapper(*args,**kwargs):#装饰的是什么函数都能用
start=time.time()
ret=f(*args,**kwargs)
print(time.time()-start)
return ret
return wrapper
@timeit
def my_func(x):
time.sleep(x)
带参数的decorator
import time
def timeit(f):
def wrapper(*args,**kwargs):#装饰的是什么函数都能用
start=time.time()
ret=f(*args,**kwargs)
print(time.time()-start)
return ret
return wrapper
@timeit
def my_func(x):
time.sleep(x)
@timeit(10)#它会先计算timeit(10),返回的是一个函数,这个函数再去调用double,再返回一个函数,相当于先返回一个decorator(也就是timeit(10)),再用这个返回的装饰器再去进行一次装饰器调用
def double_func(x):#等价于double_func=timeit(10)(double_func)
#也等价于inner=timeit(10) double_func=timeit(inner(double_fune))
return x**2