python中装饰器,可以在原有函数的功能上添加功能。
比如:
import time
def Abc():
print("this is abc")
time.sleep(1)
def Bcd():
print("this is bcd")
time.sleep(2)
def count_delay(s):
def inner():
start_time=time.time()
s()
end_time=time.time()
print("花费了%s"%(start_time-end_time))
return inner
Abc=count_delay(Abc)
Abc()
有两个函数Abc和Bcd分别功能是Abc输出“this is abc”然后停顿1秒,Bcd是输出“this is bcd”然后停顿2秒,通过一个修饰器,可以达到,最终使用Abc的时候,同时可以完成Abc计时这个功能。
这个写法 还有一个固定的方式就是
import time
def count_delay(s):
def inner():
start_time=time.time()
s()
end_time=time.time()
print("花费了%s"%(start_time-end_time))
return inner
@count_delay
def Abc():
print("this is abc")
time.sleep(1)
@count_delay
def Bcd():
print("this is bcd")
time.sleep(2)
Abc()
Bcd()
@就是装饰器提升一个函数功能的办法
当然,在这个时候的装饰器需要传入参数的话,可能会有这样那样的问题,可以把装饰器做成这样。
def count_delay(s):
def inner(*x,**y):
start_time=time.time()
s(*x,**y)
end_time=time.time()
print("花费了%s"%(start_time-end_time))
return inner
这个时候可以接收的函数传入的参数就更多样了。
装饰器还可以利用参数来表达是否进行某个操作比如刚刚这个。
import time
def is_logg(istrue):
def count_delay(s):
def inner(*x,**y):
start_time=time.time()
s(*x,**y)
end_time=time.time()
print("花费了%s"%(start_time-end_time))
if istrue==True:
print("这里可以执行istrue的内容")
return inner
return count_delay
@is_logg(True) #Abc=count_delay(Abc)
def Abc():
print("this is abc")
time.sleep(1)
@is_logg(False)
def Bcd():
print("this is bcd")
time.sleep(2)
这个时候嵌套的装饰器就带上了参数。