python装饰器原理详解,python装饰器有哪些

  python装饰器原理详解,python装饰器有哪些

  Python decorator是一个比较难理解的知识点,但是如果你是测试人员,decorator是你必须掌握的知识。通过使用decorator,您可以快速转换源代码和现有代码,以添加所需的功能。

  我在学习的时候,看的时候,听的时候,觉得自己懂了,但是练习的时候,发现卡顿了。这篇文章是我自己学习后总结出的自己的理解。

  假设已经有一个函数,如下所示:

  定义测试01():

  Print(这是原函数)这个时候我们需要记录这个函数的执行时间。我们可以直接修改函数如下:

  定义测试02():

  打印(“开始执行功能”)

  打印(“这是原始功能”)

  Print(函数执行完毕)这确实满足了我们的要求,但是有两个问题:

  首先,我们修改了原始函数的逻辑。如果这个函数很复杂,可能会给我们带来问题。而且我们添加的逻辑与原功能的业务逻辑非常不相关,不符合一个功能只能做一件事的原则。第二,如果后面加了其他逻辑,要加其他函数,直接修改函数,而且如果有100个函数要加这个函数,是不是要把100个函数一个一个的改?在不修改原有功能的情况下,我们达到要求了吗?

  你可以使用闭包。我们定义另一个函数,在这个新函数中编写我们的逻辑,将原始函数作为参数传递给新函数,并返回我们定义的新函数。

  如下所示:

  定义测试03(功能):

  def in_func():

  打印(“开始执行功能”)

  函数()

  打印(“功能完成”)

  返回输入函数

  按如下方式使用装饰功能:

  从test _ python . homework . decoration导入test03

  定义测试01():

  打印(“这是原始功能”)

  Test01=test03(test01) # test01是修饰函数,修饰函数会传递给被修饰函数。

  Test01() #再次调用修饰函数。

  执行结果也会打印出来:

  开始执行功能。

  这是原始功能。

  功能完成。

  为什么会有这样的效果?

  当这个被执行时

  Test01=test03(test01) # test01是修饰函数,修饰函数会传递给被修饰函数。

  Te01 () #再次调用修饰函数相当于执行

  定义测试03(测试01):

  def in_func():

  打印(“开始执行功能”)

  测试01()

  打印(“功能完成”)

  返回in_func首先执行test03(),然后返回in_func,代码到in_func函数执行。

  打印(“开始执行功能”)

  测试01()

  打印(“功能完成”)

  所以结果是:

  开始执行功能。

  这是原始功能。

  功能完成。

  因为这个写法太繁琐,所以python简化为@ decoration函数的名字。

  Test01=test03(test01) # test01是修饰函数,修饰函数会传递给被修饰函数。

  Te01 () #然后调用修饰函数,例如:

  从test _ python . homework . decoration导入test03

  @test03 #用test03修饰test01

  定义测试01():

  打印(“这是原始功能”)

  这是python的语法糖。

  这样,运行结果也是:

  开始执行功能。

  这是原始功能。

  功能完成。

  转载请联系作者获得授权,否则将追究法律责任。

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

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