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 test03 def 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来装饰test01 def test01(): print('这是原有函数')
这就是python的语法糖。
这样写,运行结果也是:
开始执行函数
这是原有函数
函数执行完毕
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!