python装饰器(python装饰器的原理)

网友投稿 214 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小时内删除侵权内容。

上一篇:python 语法规范(python基础教程)
下一篇:IDEA快速搭建spring boot项目教程(Spring initializr)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~