当有多个函数需要拥有相同功能时,装饰器就起到很大作用,在不改变原有函数代码时,用装饰器给函数增加一个小功能很是方便。
譬如我现在有几个函数,我想知道它们的执行时间,那么我可以写一个装饰器来实现。
def count_time(func):
def int_time(*args,**kwargs):
start_time = datetime.datetime.now() #程序开始时间
func(*args,**kwargs)
over_time = datetime.datetime.now() #程序结束时间
total_time = (over_time-start_time).total_seconds()
print('%s executed in %s seconds' %(func.__name__,total_time))
return int_time
这里使用args和kwargs允许我们在函数中传递多个参数
我希望计算几个数的加减乘除,定义不同的函数
def func1(x,y):
time.sleep(2.5)
return x + y
def func2(x,y,z):
time.sleep(2.5)
return x*y*z
用@符号调用装饰器
下面给出完整代码
import datetime,functools,time
def count_time(func):
def int_time(*args,**kwargs):
start_time = datetime.datetime.now() #程序开始时间
func(*args,**kwargs)
over_time = datetime.datetime.now() #程序结束时间
total_time = (over_time-start_time).total_seconds()
print('%s executed in %s seconds' %(func.__name__,total_time))
return int_time
@count_time
def func1(x,y):
time.sleep(2.5)
return x + y
@count_time
def func2(x,y,z):
time.sleep(2.5)
return x*y*z
func1(2,5)
func2(4,6,3)
运行结果
使用这个装饰器相当于
func=count_time(func),int_time作为返回值赋值给func