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()# 
  • 还是不能理解闭包的形式
  • 上述写法的逻辑是之前定义了一个函数,将这个函数包装一下,从而在不改变其最一开始定义的内容的情况下,再次调用这个函数(函数名相同),会在前和后添加其它逻辑与代码
相关推荐
FreakStudio4 小时前
一文速通Python并行计算:10 Python多进程编程-进程之间的数据共享-基于共享内存和数据管理器
python·嵌入式·多线程·多进程·线程同步
钰爱&4 小时前
【Linux】POSIX 线程信号量与互斥锁▲
java·开发语言·jvm
yt948324 小时前
Matlab实现绘制任意自由曲线
开发语言·matlab
黑匣子~5 小时前
java集成telegram机器人
java·python·机器人·telegram
漫谈网络6 小时前
Telnetlib三种异常处理方案
python·异常处理·telnet·telnetlib
oioihoii6 小时前
C++23 std::generator:用于范围的同步协程生成器 (P2502R2, P2787R0)
开发语言·c++·c++23
Xudde.6 小时前
加速pip下载:永久解决网络慢问题
网络·python·学习·pip
免檒6 小时前
go基于redis+jwt进行用户认证和权限控制
开发语言·redis·golang
兆。6 小时前
电子商城后台管理平台-Flask Vue项目开发
前端·vue.js·后端·python·flask
未名编程6 小时前
LeetCode 88. 合并两个有序数组 | Python 最简写法 + 实战注释
python·算法·leetcode