当前位置: 首页 > news >正文

Python装饰器本质250220

  • 定义一个函数,在不修改这个函数的代码的情况下,让函数执行前后会有新的内容加入
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函数
  • 上述写法要改写
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()# 
  • 还是不能理解闭包的形式
  • 上述写法的逻辑是之前定义了一个函数,将这个函数包装一下,从而在不改变其最一开始定义的内容的情况下,再次调用这个函数(函数名相同),会在前和后添加其它逻辑与代码
http://www.dtcms.com/a/28393.html

相关文章:

  • HTTP与网络安全
  • 华为最新OD机试真题-找单词-Python-OD统一考试(E卷)
  • topN 相似度 torch实现
  • Oracle JDK、Open JDK zulu下载地址
  • Java 与设计模式(17):责任链模式
  • 使用 Docker-compose 部署 MySQL
  • 【蓝桥】二分法
  • DP-最长公共子序列
  • 【Alertmanager】alertmanager告警系统原理剖析与应用实战,应有尽有非常全面
  • Qt能正常编译和执行,但是文本报错找不到文件
  • 程函方程的详细推导
  • MySQL_事务的四大特性
  • 【网络安全 | 漏洞挖掘】价值$40000:从路径遍历升级至RCE
  • CSS三大特性——继承、优先级与层叠
  • Redis的预备知识
  • C++中间件DDS介绍
  • 如何从共炮点数据构建速度场,为射线层析或全波形反演提供初始模型(DeepSeek R1回答)
  • AI大模型-提示工程学习笔记13-自动推理并使用工具
  • 52. 类型双关union
  • 使用vue3框架vue-next-admin导出表格excel(带图片)
  • 获取钉钉OA审批数据
  • AI工作流+专业知识库+系统API的全流程任务自动化
  • java练习(33)
  • zookeeper集群配置
  • SAP:SAP的内存管理详解
  • C++ 模板 简单易懂
  • 使用 acme.sh 申请和管理 免费SSL 证书:告别 certbot 的繁琐
  • 【数据挖掘】深度挖掘
  • vue3-05reactive定义对象类型的响应式数据(不能进行基本类型数据的响应式)
  • 聚焦于机器人研究,提出 FuSe 方法,通过语言锚定对通用机器人策略进行微调 视觉、触觉、听觉