在了解装饰器之前,首先要了解函数。在python中所有东西都是object,函数也是。因此函数可以被当作参数传进到其它函数中,也可成为一个函数的返回值。
decorator由@函数名组成。举例:
def dec(func):
pass
@dec
def new(x)
return x**2
#等价于
new = dec(new)
由上可以看出,装饰器本身就是一个函数,且是用于封装函数的代码。他接收被装饰的函数作为参数,通过使用该参数执行某些操作,然后返回一个函数引用。
decorator的作用举例:
import time
def timeit(f):
# *args, **kwargs允许变长的函数参数
# 如上my_func(x)一个参数,add(x,y)两个参数或其它个数参数皆可。
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
def add(x,y)
return x+y
my_func(1)
print(add(2,3))
该函数的作用是计时,并打印被装饰函数执行的时间。优点:当使用不同的函数时都可以比较简单的来完成这件事情。
我们有时还会见到带参数的decorator,举例:
@itemit(10)
def double(x):
return x*2
等价于
double = timeit(10)(double)
相当于等价的过程中多了一次函数调用。如上先计算timeit(10),并返回函数,在用返回的函数去调用double