装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器的作用:在不改变原函数及原函数的执行的情况下,为原函数增加一些额外的功能,比如打印日志、执行时间,登录认证等等。
测试函数的执行时间:
一个简单的装饰器:
import time
def func1():
print('晚上回家吃饭!')
time.sleep(1)
def func2():
print("晚上不回家吃饭!")
time.sleep(1)
def timer(f1):
star_time = time.time()
f1()
end_time = time.time()
print('耗时:%s'%(end_time-star_time))
f = func1
func1 = timer
func1(f)
import time
def func1():
print('晚上回家吃饭!')
time.sleep(1)
def func2():
print("晚上不回家吃饭!")
time.sleep(1)
def timer(f1): # f1 = func1
def inner():
star_time = time.time()
f1()
end_time = time.time()
print('耗时:%s'%(end_time-star_time))
return inner
func1 = timer(func1) #实际返回inner
func1() #相当于执行inner()
但是如果有多个函数,我都想让你测试他们的执行时间,你每次是不是都得func1 = timer(func1)?这样还是有点麻烦,
因为这些函数的函数名可能是不相同,有func1,func2,graph,等等,所以更简单的方法,python给你提供了,那就是语法糖。
import time
def timer(f1):
def inner():
star_time = time.time()
f1()
end_time = time.time()
print('耗时:%s'%(end_time-star_time))
return inner
@timer #相当于 func1 = timer(func1) 返回inner
def func1():
print('晚上回家吃饭!')
time.sleep(1)
func1()
带参数的装饰器:
import time
def timer(f1): #f1 = func1
def inner(*args,**kwargs):
star_time = time.time()
f1(*args,**kwargs)
end_time = time.time()
print('耗时:%s'%(end_time-star_time))
return inner
@timer #相当于 func1 = timer(func1) 返回inner
def func1(a,b):
print(a,b)
print('晚上回家吃das 饭!')
time.sleep(1)
func1(11,22) #相当于执行inner(11,22)
带返回值的装饰器
import time
def timer(f1):
def inner(*args,**kwargs):
star_time = time.time()
'''上面的代码是执行函数之前的操作'''
ret = f1(*args,**kwargs)
'''下面的部分是执行函数之后的操作'''
end_time = time.time()
print('耗时:%s'%(end_time-star_time))
return ret
return inner
@timer #相当于 func1 = timer(func1) 返回inner
def func1(a,b):
print(a,b)
print('晚上回家吃das 饭!')
time.sleep(1)
return 666
print(func1(11,22)) #相当于执行inner(11,22)
执行结果
11 22
晚上回家吃das 饭!
耗时:1.0000572204589844
666