python3的对象回收逻辑、及仿照golang的defer语义的实现

本文探讨了Python3中的对象回收机制,特别是如何模仿Golang的defer语义。通过分析Python的垃圾回收逻辑,包括引用计数和标记-清除策略,作者解释了在Python中实现类似defer功能的Defer类的可行性和限制,并给出了具体实现代码。尽管这种方法在某些场景下有效,但需要注意特殊情况如循环引用和不可变对象的优化,以及在异常处理和调试模式下的行为。
摘要由CSDN通过智能技术生成

本文基于python3及官方解释器cpython的实现。

引子:

比如说golang, 

func dealFile(fn string) {
     fd = open(fn)
     defer fd.close()  //defer保证fd.close在函数结束后被调用
     ....//在这里做其他事情
}

golang通过defer关键字来实现一种保证资源释放的办法,非常好用。

若以python来实现相关的需求,有两种办法,with和try...finally比如:
 

with  open(fn) as fd:
       ....

或者

fd = open(fn)
try:
    ...
finally:
    fd.close() #这里保证fd句柄得到关闭


这样一方面导致结构上难看(增加了缩进,如果有多个资源需要关闭,可能导致多层缩进),另外还要求对象要支持with的话必须实现额外的__enter__和__exit__方法。另外一方面with和finally的语法结构打乱了程序的业务逻辑,使得代码变得丑陋。我感觉比defer难用太多,对比来看,golang的defer是极好的设计。那么,有没有办法参考golang来自定义实现一个简洁优雅的实现呢?

我回想到,c++的RAII思想,实现一个Defer类,可以创建该类的一个对象(构造函数传入一个函数),然后在这个对象的析构函数中调用这个函数,使用的时候,在函

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值