举例讲解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)()
分析:发现只需要在方法三中的代码外包裹一层函数,就可以实现装饰器的参数化。至此,老板有要求你也不用担心做不了了。。
标签:creat,show,python,讲解,oder,举例,time,print,def 来源: https://www.cnblogs.com/king2/p/13825695.html