在了解装饰器之前,首先要了解函数。在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