现在有一个函数,其有一个功能:
def myfun():
print("myfunc start")
time.sleep(1)
print("myfunc end")
比如,myfun是一个很常用的函数,但是,每次使用时,需要对该函数进行一个扩展使用,一般可以如下:
def deco(fun):
startT = time.time()
fun()
endT = time.time()
msecs = (endT - startT) * 1000
print("it's %f ms" % msecs)
deco函数中,传入一个函数,就可以计算出该函数执行的时间。也即对fun函数进行了扩展,称为装饰器。
但是,我们可以发现,传入的fun函数本身没有受到影响,即该装饰不是长久的,所以,进行一下改造
import time
def deco(fun):
def warpper():
startT = time.time()
fun()
endT = time.time()
msecs = (endT - startT) * 1000
print("it's %f ms" % msecs)
return warpper
def myfun():
print("myfunc start")
time.sleep(1)
print("myfunc end")
myfun()
print("*"*20)
myfun=deco(myfun)
myfun()
此时,myfun()再进行单独调用的时候,就可以直接打印出该函数的执行时间了,为了简化其中的
myfun=deco(myfun)操作,我们此时可以更加简化为:
import time
def deco(fun):
def warpper():
startT = time.time()
fun()
endT = time.time()
msecs = (endT - startT) * 1000
print("it's %f ms" % msecs)
return warpper
@deco
def myfun():
print("myfunc start")
time.sleep(1)
print("myfunc end")
myfun()
print("*"*20)
# myfun=deco(myfun)
myfun()
利用@符号来进行标记。这样,myfun函数从一个简单的sleep操作,变成了可以打印出其执行时间的函数。如果还需要对其进行其他的装饰,可以写个装饰函数,实现功能的扩展。例如
import time
def deco(fun):
def warpper():
startT = time.time()
fun()
endT = time.time()
msecs = (endT - startT) * 1000
print("it's %f ms" % msecs)
return warpper
def deco2(fun):
def warpper():
fun()
print("deco 2")
return warpper
@deco2
@deco
def myfun():
print("myfunc start")
time.sleep(1)
print("myfunc end")
myfun()
print("*"*20)
# myfun=deco(myfun)
myfun()
打印结果为:
myfunc start
myfunc end
it's 1000.057459 ms
deco 2
********************
myfunc start
myfunc end
it's 1000.056982 ms
deco 2
装饰的嵌套,还是很强大的功能吧。
ps:编辑器用pycharm的社区版,免费的,习惯的AndroidStudio,所以倾向于Jetbrain的产品。