举例讲解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)()

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

原文地址:https://www.cnblogs.com/king2/p/13825695.html