python之装饰器

装饰器这个功能非常有意思,也十分有用,我把看了大家的文章总结的一点想法写一下。

现在有这么一个需求:我们的代码中有多个函数,每执行一次一个函数,统计一次此函数的执行时间。

一、普通的实现方法

#!/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

原文地址:https://www.cnblogs.com/kongzhagen/p/6704771.html