python装饰器详解,python中装饰器的定义

  python装饰器详解,python中装饰器的定义

  本文主要介绍测试Python decorator接口的步骤。本文通过具体实例详细讲解,对你的学习或工作有一定的参考价值。有需要的朋友可以参考一下。

  00-1010首先看一下闭包的语法:其次看一下decorator版本闭包的语法:最后看一下decorator的语法:在编写接口case的时候,有时候需要在cae上做一些常见的操作,最典型的场景有:获取case的执行时间,打印日志等。

  难道没有一种方法可以专注于常见的操作,从而避免在每种情况下都编写相同的代码(例如,每种情况都需要编写相同的代码来获得执行时间)吗?

  Python的decorator可以做到这一点。

  你可以这样理解装修工。装饰器使用闭包来装饰目标函数(目标函数是闭包的外部函数的引用),即在目标函数执行前后,执行一些指定的代码来完成期望的业务逻辑。

  概念总是看起来晦涩难懂,所以直接看语法。

  

目录

  def外部(a):

  b=10

  # inner是一个内部函数。

  内部定义():

  #外部函数的临时变量在内部函数中使用。

  打印(a b)

  #外部函数的返回值是对内部函数的引用

  返回内部

  

第一步,先看一下闭包的语法:

  和上面的闭包例子只有一点不同:闭包中外部函数的引用是整数A,此时是函数的引用(函数的引用也是函数名)。

  # Decorator使用闭包原理:在外层函数内部定义一个内层函数,外层函数使用外层函数的局部变量,外层函数返回内层函数的引用。

  def outer(target): # Decorator函数传入一个对你要修饰的目标函数的引用,这个引用将在内部函数中使用。

  b=10

  c=1

  d=5

  # inner是一个内部函数。

  内部定义():

  印刷(公元前)

  #外部函数传入的参数target是你要修饰的目标函数的引用。

  Target() #这里实际执行的是目标函数,我想修饰一下这个函数,所以我会在这个函数执行前后做一些操作。具体操作要看业务逻辑。

  打印(c d)

  #外部函数的返回值是对内部函数的引用

  返回内部

  注意:target只是对函数的引用(引用指向函数在内存中的位置),不会被执行。只有在采用(target())时,才会执行该函数。

  

第二步,再来看一下闭包的装饰器版本的语法:

  @装饰者

  定义测试_01():

  所以可以得出结论,decorator是闭包的外部函数,即outer()(decorator是一个函数,即闭包的外部函数),修饰函数test_01是闭包传入的参数,即target。

  例如:

  以统计每个接口的请求时间为例。

  装饰者(decorat.py):

  导入时间

  定义时间消耗(函数):

  内部定义():

  Time_start=time.time() #取目标函数开始前的时间

  打印( \ n接口请求之前的时间为,time_start)

  函数()

  Time_end=time.time() #取目标函数结束后的时间

  打印(接口请求后的时间为,time_end)

  T=time_end-time_start #计算目标函数执行的时间。

  打印(接口占用: ,t)

  返回内部

  接口(test_case.py):

  导入请求

  导入装饰

  @decorat.time_consume

  def测试_演示():

  RES=requests . get( https://www . Baidu.com )

  断言res.status_code==200

  效果:

  再来总结下这个例子的整个过程:

  

'''
@decorat.time_consume实际上执行的是: test_demo = @decorat.time_consume(test_demo)
因为编程语言都是从右向左来解析执行的,那么这句代码会发生的事情是:

   1 、把目标函数test_demo(是一个变量名,里面存的是目标函数的引用) 传入time_consume函数,被参数func接收,这时func也是目标函数的引用 func和test_demo指向同一个函数对象
2 、time_consume函数定义了内部函数inner,在inner里调用func,
这用到闭包的原理(闭包原理:外函数结束的时会把自身的引用绑定给内函数),外函数结束的时候会把func绑定给内函数,供内函数来使用
3、 外函数结束的时候把自己创建的内函数的引用inner返回给test_demo接收,
这时test_demo已经不是原来编写的目标函数了,test_demo可以理解成是一个inner函数的实例对象,再执行test_demo() 的时候实际上执行了inner()的一个对象
4、 再执行test_demo() 的时候 实际上执行了inner() :
先执行取时间,打印
之后执行func(),才是执行目标函数,即执行test_demo()本身
最后再次取时间,打印结果

  

  大白话版本:

  

其实就一句话:
被装饰函数作为装饰器外部函数的参数传入,在装饰器的内部函数中执行被装饰函数,并外加其他的代码片段A,
这样被装饰函数除了具备自身的逻辑外,也拥有了装饰器内部函数中代码片段A的逻辑。使得无需修改被装饰函数,
就增强了被装饰函数的功能。

  

  再来看两种情景。

  第一个:被装饰函数有参数

  一般接口测试的test_case不会想上面例子中提到的是一个函数,而是作为一个类的方法出现的,比如:

  

  运行报错了,报错日志的意思是inner()需要0个入参,但是被传入了1个。通过该报错证明了上面提到的这个结论

  

  原因是test_demo()有参数self,而inner()没有定义入参。怎么解决呢,给inner()定义一个可变入参?先来看第二个问题,最后一起来证明我们的推测吧。

  第二个:被装饰函数有返回值

  

  问题出现了,返回值打印出来是None,因为inner()里没有变量去接收test_demo的返回值并返回吗?带着第一个问题的推测,一起来改下代码。

  做2处改动:

  1、inner()定义可变入参

  2、inner()里定义变量去接收test_demo的返回值并return该变量

  

  test_case作为一个类的方法出现的问题解决了。

  

  返回值也能被正常打印了。

  改动后的装饰器可以作为一个定义装饰器的通用模板,基本可以给各种各样的函数来装饰了。

  

def decorat_demo(func):

   def inner(*args, **kwargs): # inner()接收可变参数

   # any code before # 定义目标函数前的操作

   # 调用目标函数

   res = func(*args, **kwargs) # 定义变量接收目标函数返回值

   # any code after # 定义目标函数后的操作

   return res # 返回目标函数返回值

   return inner

  到此这篇关于Python装饰器使用接口测试的步骤的文章就介绍到这了,更多相关python装饰器接口测试内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: