Python装饰器本质250220

  • 定义一个函数,在不修改这个函数的代码的情况下,让函数执行前后会有新的内容加入
python 复制代码
def func():
    print("func")
    return
def outer():
    def inner():
        print("new code before")
        func()
        print("new code after")
        return
    return inner
func = outer()# 执行到这一步,func指向变为inner
func()# 相当于执行inner(),而调用inner()时,打印before后,再调用第7行func(),就是又调用了inner(),如此反复,耗尽函数栈
  • 上述的写法会变成死循环,在第11行相当于修改了func函数的指向,导致反复调用outer函数
  • 上述写法要改写
python 复制代码
def func():
    print("func")
    return [1, 2, 3]
def outer(arg):
    def inner():
        print("before")
        res = arg()
        print("after")
        return res
    return inner
func = outer(func)# 经过outer包装为闭包,括号内的func还是指向原定义的函数,等号左边func是指向了inner,左右两个func是不同的
func()# 
  • 还是不能理解闭包的形式
  • 上述写法的逻辑是之前定义了一个函数,将这个函数包装一下,从而在不改变其最一开始定义的内容的情况下,再次调用这个函数(函数名相同),会在前和后添加其它逻辑与代码
相关推荐
2501_921649492 分钟前
2026个人量化交易免费数据API接入:从选型到实操
经验分享·python·金融·api·个人开发·量化交易
wgzrmlrm748 分钟前
如何解决ORA-28040没有匹配的验证协议_sqlnet.ora版本兼容设置
jvm·数据库·python
维度攻城狮9 分钟前
pycallgraph2drawio:Python 调用链可视化 + Draw.io 自由编辑
开发语言·python·draw.io·graphviz
蒙奇·D·路飞-18 分钟前
大模型时代下 Java 后端开发的技术重构与工程实践
java·开发语言·重构
极光代码工作室20 分钟前
基于NLP的智能客服系统设计与实现
python·深度学习·机器学习·ai·自然语言处理
wljy120 分钟前
Qt入门(一)
开发语言·qt
Mr_Xuhhh22 分钟前
深入Java多线程进阶:从锁策略到并发工具全解析
前端·数据库·python
ZK_H1 小时前
半导体工艺流程
java·c语言·开发语言·计算机网络·金融
apcipot_rain1 小时前
Python实战——蒙特卡洛模拟分析杀牌游戏技能收益
python·游戏·数学建模
计算机安禾1 小时前
【数据结构与算法】第39篇:图论(三):最小生成树——Prim算法与Kruskal算法
开发语言·数据结构·c++·算法·排序算法·图论·visual studio code