装饰器这个功能非常有意思,也十分有用,我把看了大家的文章总结的一点想法写一下。
现在有这么一个需求:我们的代码中有多个函数,每执行一次一个函数,统计一次此函数的执行时间。
一、普通的实现方法
#!/usr/bin/env python # _*_ coding:utf-8 _*_ import time # 加法运算 def addFunc(): start = time.time() print "start add func ..." print 2 + 3 print "end add func ..." end = time.time() print "Total time is %s" %(start - end) # 减法运算 def minusFunc(): start = time.time() print "start minus func ..." print 2 - 3 print "end minus func ..." end = time.time() print "Total time is %s" % (start - end) # 乘法运算 def mulFunc(): start = time.time() print "start mul func ..." print 2 * 3 print "end mul func ..." end = time.time() print "Total time is %s" % (start - end) addFunc() minusFunc() mulFunc() 结果: start add func ... 5 end add func ... Total time is 0.0 start minus func ... -1 end minus func ... Total time is 0.0 start mul func ... 6 end mul func ... Total time is 0.0
2、我们发现为了统计每个函数的执行时间,每个函数中都要重复加入一段统计时间的代码,
start = time.time()
end = time.time()
print "Total time is %s" % (start - end)
怎么解决代码重复问题呢,好,我们另加一个额外函数deco,专门处理时间统计问题。
#!/usr/bin/env python # _*_ coding:utf-8 _*_ import time def deco(func): start = time.time() func() end = time.time() print "Total time is %s" % (start - end) # 加法运算 def addFunc(): print "start add func ..." print 2 + 3 print "end add func ..." # 减法运算 def minusFunc(): print "start minus func ..." print 2 - 3 print "end minus func ..." # 乘法运算 def mulFunc(): print "start mul func ..." print 2 * 3 print "end mul func ..." end = time.time() deco(addFunc) deco(minusFunc) deco(mulFunc) 运行结果: start add func ... 5 end add func ... Total time is 0.0 start minus func ... -1 end minus func ... Total time is 0.0 start mul func ... 6 end mul func ... Total time is 0.0
3、相同的运行结果,我们的确节省了代码,并使代码简洁化了,但是执行方法有点古怪,我们想运行addFunc()却必须运行deco(addFunc)才能得到统计时间,如何解决呢?
我们试一下@语法糖试试。
显然@的作用相当于将其作用的函数以参数的形式传给它,然后执行@后面的函数
4、有一个问题,我们的函数很有可能是带参数的,那我们就只能给deco函数也带上一个万能参数*args, **kwargs