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()# 
  • 还是不能理解闭包的形式
  • 上述写法的逻辑是之前定义了一个函数,将这个函数包装一下,从而在不改变其最一开始定义的内容的情况下,再次调用这个函数(函数名相同),会在前和后添加其它逻辑与代码
相关推荐
“AI国潮设计-小江”5 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
程序喵大人5 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
wenwen_chao5 小时前
Python学习与开发资源合集:实用技巧与工具推荐
python
for_ever_love__6 小时前
函数——参数、lambda、*args与作用域
python·函数·大模型开发·编程基础
东莞市云毅网络有限公司6 小时前
企业资料时效性判定:Last-Modified、正文日期与版本字段三路交叉
python·sqlite·自动化运维·geo·数据监测
Query*6 小时前
深入浅出LangGraph【一】_基础篇
python·ai·langchain
sunshine22 girl7 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
XiaoMaqqqq7 小时前
市面上正规的IP驱动产业新场景新工具哪家强
运维·python·网络协议·tcp/ip
菜鸟~noob2337 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
ShyanZh7 小时前
【Python3基础】19-Socket 与 TCP、UDP 编程
python·网络协议·tcp/ip·udp