Flask接口签名sign原理与实例代码浅析
260
2022-09-02
python装饰器(python装饰器的原理)
python装饰器,相对来说是比较难理解的知识点,但如果作为一个测开人员,装饰器是必须掌握的知识,通过使用装饰器可以对源码、已有代码进行快速改造,增加想要的功能。
学习的时候,看的时候,听的时候,觉得自己理解了,但是到自己实操时,发现卡顿,本文是自己学习后,以自己的理解,总结的文章。
假设已有一个函数,如下:
def test01(): print('这是原有函数')
这时需要记录这个函数的执行时间,我们可以直接修改函数,如下:
def test02(): print('开始执行函数') print('这是原有函数') print('函数执行完毕')
这样确实是实现了我们的要求,但是有两个问题:
一是我们修改了原函数的逻辑,如果这个函数很复杂,可能会被我们改出问题,并且我们加入的逻辑很是与原函数业务逻辑无关的内容,不符合一个函数只做一件事的原则。二是如果后面还有加其他逻辑,要增加其他功能,又要直接修改函数,并且如果有100个函数要增加这个功能,难道我们逐一去改100个函数吗?
有没有在不修改原来函数的情况下,实现我们的要求呢?
可以用闭包。我们另外定义一个函数,在这个新的函数里面写我们的逻辑,把原函数作为一个参数传给新的函数,返回我们定义的新函数。
如下:
def test03(func): def in_func(): print('开始执行函数') func() print('函数执行完毕') return in_func
使用装饰函数,如下:
from test_python.homework.decorate import test03def test01(): print('这是原有函数')test01 = test03(test01) # test01是被装饰函数,将被装饰函数传给装饰函数test01() # 再调用被装饰函数
这个执行结果也是打印出:
开始执行函数
这是原有函数
函数执行完毕
为什么会有这样的效果呢?
执行这个的时候
test01 = test03(test01) # test01是被装饰函数,将被装饰函数传给装饰函数test01() # 再调用被装饰函数
相当于执行
def test03(test01): def in_func(): print('开始执行函数') test01() print('函数执行完毕') return in_func
首先执行test03(),执行完后是返回in_func,代码又去找in_func函数执行,就执行了
print('开始执行函数')
test01()
print('函数执行完毕')
所以结果是:
开始执行函数
这是原有函数
函数执行完毕
因为这种写法太繁琐,python简化成了@装饰函数名
test01 = test03(test01) # test01是被装饰函数,将被装饰函数传给装饰函数test01() # 再调用被装饰函数
如:
from test_python.homework.decorate import test03@test03 # 用test03来装饰test01def test01(): print('这是原有函数')
这就是python的语法糖。
这样写,运行结果也是:
开始执行函数
这是原有函数
函数执行完毕
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~