python 装饰器 闭包

在javascript中,有时候调用settimeout函数

复制代码
function fetchData(url) {
  setTimeout(function () {
    console.log(`Fetching data from ${url}`);
  }, 2000);
}

fetchData('https://api.example.com');

这里就是经常使用闭包,函数执行完毕但是变量生命周期还没有结束,因为回调函数还在使用,这里就是闭包,用于延长局部变量生命周期,可能由内存泄漏风险

python也一样:但是python闭包引用需要生命nonlocal才能使用,类似global

复制代码
def outer(fn):
    a = 0

    def inner():
        nonlocal a
        a = a + 1
        return a

    return inner


a = outer(open)
print(a())
print(a())
print(a())


输出
1
2
3

在java中使用aop对方法进行增强,使用注解指示切入函数,python也有增强概念,使用装饰器,与注解类似,但是对增强的方法增加的方法使用闭包模式,参数为fn

复制代码
def enhance(fn):
    def inner(*args,**kwargs):
        print("before test")
        sum = fn(*args,**kwargs)
        print(f"result is {sum}")
        print("after test")
    return inner

@enhance
def test(*args,**kwargs):
    print(f"i am function test,args={args},kwargs={kwargs}")
    sum = 0
    for arg in args: sum += arg
    for arg in kwargs.values(): sum += arg
    return sum





if __name__ == '__main__':
    test(1, 2,3,4,a=5,b=6,c=7,d=8)

before test

i am function test,args=(1, 2, 3, 4),kwargs={'a': 5, 'b': 6, 'c': 7, 'd': 8}

result is 36

after test

Process finished with exit code 0

相关推荐
2601_967980113 小时前
深入理解词向量算法及其在Python中的实践
python·word2vec·glove·fasttext·词向量
129Lab4 小时前
电池循环测试数据自动化分析:用Python+AI工具构建一键式寿命评估流水线
python·数据分析·电池测试·数据自动化·寿命评估
treasure1404 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
Dmz丶5 小时前
前端转 AI 100 天 Day 44:前端集成实战——用 React 给 Agent 做个正式界面
python
jay神5 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
DeepVisionary5 小时前
阿里云上线旗舰多模态新模型,不公布跑分且限时14天退役
python·自动化
东莞市云毅网络有限公司5 小时前
FAQ 覆盖度打分:TF-IDF 与向量嵌入双路召回的 Python 实现
python·数据清洗·rag·企业知识库·文档解析
爱笑的k115 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm
用户8356290780516 小时前
使用 Python 控制 Excel 工作表的分页位置
后端·python
用户8356290780516 小时前
Python 如何在 Word 中添加和管理文档变量
后端·python