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

相关推荐
泡茶喝茶写代码1 小时前
A股量化策略回测实战:从行情数据到绩效评估(第 13 篇):放量突破策略
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口
cxyxixiy1 小时前
数智码力:数据核对不用人工比对,Python 快速完成多表格差异校验
开发语言·python·学习
LMT流氓兔2 小时前
第五单元——第11课:自动测试“拒绝后绝不能写入”
数据库·人工智能·python·langchain
ratel️2 小时前
小墨析 · Office Agent 日常办公不烧心
python·langchain·word·excel·fastapi·js·ppt
MrGet2 小时前
一步一步学Python(三):文件读写
python
是Yu欸3 小时前
先让 T1 Pro 传回一张好用的图:JPEG 抓拍、RTSP 视频与方向校正
python·机器人·音视频
伞伞悦读3 小时前
【第60期】特征值不是重要性:Python 特征分解与 PCA 的前置判断
python
2601_967980113 小时前
Python之wxPython模块的安装
linux·windows·python·wxpython·gui设计·1024程序员节
云南新人和数采集团3 小时前
DeepSeek Harness 开源贡献手记:从入门到合入主线
python·开源·github