• 举例讲解python装饰器的使用


    需求:领导想知道,该测试用例执行,用例的运行时间是多少,我们怎么实现该代码?

    如下:想要实现下面用例的运行时间是多少,怎么做?

    def creat_oder():
        """这个是原代码,一条测试用例"""
        print("执行测试用例")
        time.sleep(1)

    你可能会想到,记录开始时间,结束时间,然后计算差就行了呗,好,那我们来看看

    #第一种方法在函数内去修改

    import time
    def creat_oder():
        start_time=time.time()  #开始时间
        print("执行测试用例")     #假设它是需要执行的测试用例
        time.sleep(1) #为了增加显示效果
        end_time=time.time()     #结束时间
        print("用例的运行时间是:",end_time-start_time)
    creat_oder()

    分析:这样做真的可以吗,看起来好像是没有错,但是已经修改了原来的代码结构,要是有其他同事也调用这个函数,是不是看见代码被改了,想锤你。那怎么办?

    你可能会想到,那我写个重新写个函数,然后调用这个creat_oder函数不就行了吧。好,那我们继续看。

    #第二种方法、把函数当作参数传递给另一个函数

    import time
    def creat_oder():
        print("执行测试用例")
        time.sleep(1)
    def show_time(func):
        start_time=time.time()
        func()
        end_time=time.time()
        print("用例的运行时间是:",end_time-start_time)
    show_time(creat_oder)

    #分析:以上的方法逻辑没有问题,也可以实现。但是修改了函数名字.因为我们每次都需要将函数creat_oder作为一个参数传递给show_time函数 、之前的运行逻辑是直接运行creat_oder函数,但是现在不得不运行show_time(creat_oder)。 假设有10个方法调用需要creat_oder函数去统计运行时间,那是不是得修改10处地方,很麻烦怎么办?

    #第三种方法,装饰器的使用(绕了这么久就是为了讲这个)

    #定义装饰器
    def show_time(func):  #func参数
        def inner(): #将需要对creat_oder增加的代码写到这里面
            start_time=time.time()
            func()
            end_time=time.time()
            print("用例的运行时间是:", end_time - start_time)
        return inner
    
    #使用装饰器
    @show_time  #语法糖@ 等价于 creat_oder=show_time(creat_oder)
    def creat_oder():
        print("执行测试用例")
        time.sleep(1)
    creat_oder()

    分析:就是将需要增加的代码写在inner里面,然后给它定义一个装饰器名字,使用的时候在原来代码上加上@语法糖和装饰器名称,就到达了装饰目的。

    看完以上代码,你应该明白了,装饰器就是对我们原有的代码进行增强,修饰的作用,就好像装修房子一样,不对房子的结构做改变,但是需要贴壁纸,置办家具让房子变得更好看更舒适。

    那再补充一点,这个时候,老板又提出了要求,说需要知道这个用例的执行人是谁??怎么做?

    第四种方法、带参数的函数装饰器(强化)

    import time
    def who_body_run(name):
        def show_time(func):
            def inner():
                start_time=time.time()
                func()
                end_time=time.time()
                print("用例的运行时间是:", end_time - start_time)
                print("执行者是:",name)
            return inner
        return show_time
    
    @who_body_run('tom')  
    def creat_oder():
        print("执行测试用例")
        time.sleep(1)
    creat_oder()  #等价于who_body_run('tom')(creat_oder)()

    分析:发现只需要在方法三中的代码外包裹一层函数,就可以实现装饰器的参数化。至此,老板有要求你也不用担心做不了了。。

  • 相关阅读:
    java Math类
    JAVA Date类与Calendar类【转】
    java Runtime类
    Java System类
    java 多线程
    java 包
    Java 内部类
    java 抽象类 以及模块方法设计模式,接口
    java 单例模式
    java 关于Java中静态代码块以及构造函数的执行先后顺序
  • 原文地址:https://www.cnblogs.com/king2/p/13825695.html
Copyright © 2020-2023  润新知