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()# 
  • 还是不能理解闭包的形式
  • 上述写法的逻辑是之前定义了一个函数,将这个函数包装一下,从而在不改变其最一开始定义的内容的情况下,再次调用这个函数(函数名相同),会在前和后添加其它逻辑与代码
相关推荐
数据江湖39 分钟前
进阶版:Python面向对象
python·元类·单例类·抽象基类·属性封装·可迭代对象、迭代器、生成器
上官鹿离41 分钟前
Selenium教程(Python 网页自动化测试脚本)
python·selenium·测试工具
chxii1 小时前
1.8 axios详解
开发语言·前端·javascript
Yang-Never1 小时前
设计模式 -> 策略模式(Strategy Pattern)
android·开发语言·设计模式·kotlin·android studio·策略模式
都叫我大帅哥1 小时前
当AI遇上话痨:LangGraph的`trim_messages`裁剪艺术完全指南
python·langchain·ai编程
Java&Develop1 小时前
Java中给List<T> 对象集合去重
java·开发语言
都叫我大帅哥1 小时前
RNN:当神经网络有了记忆,却得了健忘症
python·深度学习
沐知全栈开发1 小时前
Perl 格式化输出
开发语言
mit6.8242 小时前
[自动化Adapt] 父子事件| 冗余过滤 | SQLite | SQLAlchemy | 会话工厂 | Alembic
python·算法·自动化
wjs20242 小时前
SQLite 注入:深入理解与防范策略
开发语言