• 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

  • 相关阅读:
    A1061 Dating [字符串比较]
    A1058 A+B in Hogwarts [进制转换]
    A1027 Colors in Mars[简单模拟--进制转换]
    A1031 Hello World for U[图形输出]
    刷PAT的一些思考—Day 1
    A1009 Product of Polynomials[简单模拟--多项式相乘]
    A1002 A+B for Polynomials[简单模拟--多项式相加]
    A1046 Shortest Distance [简单模拟--卡算法复杂度]
    1009 说反话
    usb之配置描述符
  • 原文地址:https://www.cnblogs.com/kongzhagen/p/6704771.html
Copyright © 2020-2023  润新知