什么是装饰器

在Python中装饰器是一个返回函数的函数,用来将一些函数批量重写(增加一些相同的功能)。比如我们需要实现一个调试重写函数我们就可以用到装饰器。

不过在此之前我们还需要理解Python传参的类型。在Python中参数一般以tuple或者dict格式传输(其中固定参数以tuple元组关键字参数使用dict)。使用*与**在传参过程中对tuple和dict进行解包。

动手写装饰器

我们还是先看一个简单的例子吧。

def PrintFnName(fn):
  # *和**可以理解为指针
  # 如果你有C或C++基础的话
  # 作为声明时必须加上,与使用时
  # 写法一样,但意义完全不一样。
  def wrap_fn(*args, **kwargs):
    print("FnName:" + fn.__name__)
    return fn(*args, **kwargs)
  return wrap_fn

@PrintFnName
def f(x): return x<<2

在这个例子中我们定义了一个PrintFnName装饰器,用于打印函数的名字。参考代码也能推测出被调用时会打印些什么了吧?假设我们给f传入参数9,即f(9)那么输出将会是如下格式(交互/REPL模式下)

FnName:f
36

上面的代码等价于PrintFnName(f)(9)

但前面写出来会更方便更容易理解一些不是么?

更高级的装饰器

装饰器能提供一个参数返回另一个装饰器。

@wrap('Integer')
def f(x) return x<<2

f(9)

等价于wrap(‘Integer’)(f)(9),wrap函数收到了一个参数’Integer’然后会返回另一个修饰整数的装饰器,用来修饰fn函数。因为篇幅问题(其实是懒)不再深入了解,有兴趣可以查查看。

注意

如果你在使用09年以前的Python版本,那么你可能无法使用这一特性。请确保你的Python是最新版本的2.7.x与3.6.x(十年不更新是什么心态?)