python变量可以使用del释放资源_浅谈__del__()方法的特殊用法

Python中有一些特殊方法,它们允许我们的类和Python更好地集成。在标准库参考(Standard Library Reference)中,它们被称为基本特殊方法,是与Python的其他特性无缝集成的基础。

__del__()方法有一个让人费解的使用场景。

这个方法的目的是在将一个对象从内存中清除之前,可以有机会做一些清理工作。如果使用上下文管理对象或者with语句来处理这种需求会更加清晰。对于Python的垃圾回收机制而言,创建一个上下文比使用__del__()更加容易预判。

但是,如果一个Python对象包含了一些操作系统的资源,__del__()方法是把资源从程序中释放的最后机会。例如,引用了一个打开的文件、安装好的设备或者子进程的对象,如果我们将资源释放作为__del__()方法的一部分实现,那么我们就可以保证这些资源最后会被释放。

很难预测什么时候__del__()方法会被调用。它并不总是在使用del语句删除对象时被调用,当一个对象因为命名空间被移除而被删除时,它也不一定被调用。Python文档中用不稳定来描述__del__()方法的这种行为,并且提供了额外的关于异常处理的注释:运行期的异常会被忽略,相对地,会使用sys.stderr打印一个警告。

基于上面的这些原因,通常更倾向于使用上下文管理器,而不是实现__del__()。

1. 引用计数和对象销毁

CPython的实现中,对象会包括一个引用计数器。当对象被赋值给一个变量时,这个计数器会递增;当变量被删除时,这个计数器会递减。当引用计数器的值为0时,表示我们的程序不再需要这个对象,并且可以销毁这个对象。对于简单对象,当执行删除对象的操作时会调用__del__()方法。

对于包含循环引用的复杂对象,引用计数器有可能永远也不会归零,这样就很难让__del__()方法被调用。

我们用下面的一个类来看看这个过程中到底发生了什么。

class Noisy:   def __del__( self ):     print( "Removing {0}".format(id(self)) )

我们可以像下面这样创建和删除这个对象。

>>> x= Noisy() >>>del x Removing 4313946640

我们先创建,然后删除了Noisy对象,几乎是立刻就看到了__del__()方法中输出的消息。这也就是说,当变量x被删除后,引用计

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值