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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。