python函数装饰器
装饰器顾名思义就是用于一个函数的二次加工。举个例子,我们辛辛苦苦写好了一个函数结果现在我们需要加入新的功能,那么这个时候请问你怎么做。显然重新去改一下代码如果代码量多的话是不划算的。或者说一需要对多个个函数增加同一个功能,如果粘贴复制显然又是不太高效的这个时候就引入了装饰器这种东东。
举个栗子
现在我们定义一个函数
import time
def need_change():
time.sleep(2)#让它沉睡2秒
然后我们现在需要加入一个计时功能,计算这个程序运行的时间。
改一下,变成这样
import time
def need_change():
star=time.time()
time.sleep(2)#让它沉睡2秒
end=time.time()
print(end-star)
很好,成功改动加入功能,那么现在我还有10个这样的程序需要添加这样的功能怎么办。
编写装饰函数
我们的目的是为了得到一个加入了功能的新函数,既然如此那么就直接定义一个函数并且这个函数可以返回一个新函数。
def decorate(func):
def new_function():
star=time.time()
func()
end=time.time()
print(end-star)
return new_function
这样就可以看到我们直接返回一个新的函数。
import time
def need_change():
time.sleep(2)#让它沉睡2秒
def decorate(func):
def new_function():
star=time.time()
func()
end=time.time()
print(end-star)
return new_function
need_change= decorate(need_change)
need_change()
但是这里要注意的是need_change函数其实已经不是原来的了,而是new_function这个函数。
不然你可以看看这段代码;
import time
def need_change():
time.sleep(2)#让它沉睡2秒
def decorate(func):
def new_function():
star=time.time()
func()
end=time.time()
print(end-star)
return new_function
print('我是这个函数%s'%need_change.__name__)
need_change= decorate(need_change)
need_change()
print('我是这个函数%s'%need_change.__name__)
小糖豆的使用
为了更方便一下我们可以在修改一下代码。
import time
def decorate(func):
def new_function():
star=time.time()
func()
end=time.time()
print(end-star)
return new_function
@decorate
def need_change():
time.sleep(2)#让它沉睡2秒
need_change()
print('我是这个函数%s'%need_change.__name__)
这个符号@就相当于
need_change= decorate(need_change)
好了,就那么多。
扫描二维码关注公众号,回复:
12172783 查看本文章