原文链接

python函数装饰器

装饰器顾名思义就是用于一个函数的二次加工。举个例子,我们辛辛苦苦写好了一个函数结果现在我们需要加入新的功能,那么这个时候请问你怎么做。显然重新去改一下代码如果代码量多的话是不划算的。或者说一需要对多个个函数增加同一个功能,如果粘贴复制显然又是不太高效的这个时候就引入了装饰器这种东东。

举个栗子

现在我们定义一个函数

  1. import time
  2. def need_change():
  3. time.sleep(2)#让它沉睡2

然后我们现在需要加入一个计时功能,计算这个程序运行的时间。
改一下,变成这样

  1. import time
  2. def need_change():
  3. star=time.time()
  4. time.sleep(2)#让它沉睡2
  5. end=time.time()
  6. print(end-star)

很好,成功改动加入功能,那么现在我还有10个这样的程序需要添加这样的功能怎么办。

编写装饰函数

我们的目的是为了得到一个加入了功能的新函数,既然如此那么就直接定义一个函数并且这个函数可以返回一个新函数。

  1. def decorate(func):
  2. def new_function():
  3. star=time.time()
  4. func()
  5. end=time.time()
  6. print(end-star)
  7. return new_function

这样就可以看到我们直接返回一个新的函数。

  1. import time
  2. def need_change():
  3. time.sleep(2)#让它沉睡2
  4. def decorate(func):
  5. def new_function():
  6. star=time.time()
  7. func()
  8. end=time.time()
  9. print(end-star)
  10. return new_function
  11. need_change= decorate(need_change)
  12. need_change()

@一下,python(装饰器)语法小糖豆。 - 图1
但是这里要注意的是need_change函数其实已经不是原来的了,而是new_function这个函数。
不然你可以看看这段代码;

  1. import time
  2. def need_change():
  3. time.sleep(2)#让它沉睡2
  4. def decorate(func):
  5. def new_function():
  6. star=time.time()
  7. func()
  8. end=time.time()
  9. print(end-star)
  10. return new_function
  11. print('我是这个函数%s'%need_change.__name__)
  12. need_change= decorate(need_change)
  13. need_change()
  14. print('我是这个函数%s'%need_change.__name__)

@一下,python(装饰器)语法小糖豆。 - 图2

小糖豆的使用

为了更方便一下我们可以在修改一下代码。

  1. import time
  2. def decorate(func):
  3. def new_function():
  4. star=time.time()
  5. func()
  6. end=time.time()
  7. print(end-star)
  8. return new_function
  9. @decorate
  10. def need_change():
  11. time.sleep(2)#让它沉睡2
  12. need_change()
  13. print('我是这个函数%s'%need_change.__name__)

这个符号@就相当于

  1. need_change= decorate(need_change)

@一下,python(装饰器)语法小糖豆。 - 图3
好了,就那么多。(不过有点可惜的是,最近写的博客可能是我目前最后写的博客,是的因为高考志愿的问题,我本人是没有发挥出应有的水平导致我的成绩并不理想。最后我是选择了一个不理想的学校为了能够选择一个适合自己的专业,比如软件工程,网络工程之类的,并且不服从调剂(平行志愿)。所以可能会导致滑档,那么这样的话我就将投身于复读大军,所以你懂的。确实最近也比较焦虑在等待录取结果,但愿能有一个好结果吧,希望获得好运!)