什么是__del__方法,如何调用? - python

我正在阅读代码。在其中定义了__del__方法的类。我发现此方法用于销毁该类的实例。但是,我找不到使用此方法的地方。这样做的主要原因是我不知道如何使用此方法,可能不是这样:obj1.del()。因此,我的问题是如何调用__del__方法?

参考方案

__del__是终结器。当对象被垃圾回收时调用该方法,该操作在删除该对象的所有引用之后的某个时间发生。

在简单的情况下,这可能是在您说出del x之后,或者,如果x是局部变量,则在函数结束之后。特别是,除非有循环引用,否则CPython(标准Python实现)将立即进行垃圾回收。

但是,这是CPython的实现细节。 Python垃圾回收的唯一必需属性是,它会在删除所有引用之后发生,因此这可能在此之后没有必要立即发生,也可能根本没有发生。

此外,由于多种原因,变量可以长期存在,例如传播异常或模块自省可以使变量引用计数大于0。而且,变量可以是引用循环的一部分—启用垃圾回收的CPython大部分(但不是全部)中断此类循环,甚至只是周期性地中断。

由于您不能保证它已执行,因此永远不要将需要运行的代码放入__del__()-而是,此代码属于finally块的try子句或声明。但是,with有有效的用例:例如如果对象__del__引用X并且还在全局YY)中保留cache引用的副本,那么cache['X -> Y'] = Y删除缓存条目也是有礼貌的。

如果您知道析构函数提供了必要的清除操作(违反了上述准则),则您可能希望直接调用它,因为在方法上没有什么特别之处:X.__del__。显然,只有在知道不介意被两次调用的情况下,才应该这样做。或者,作为最后的选择,您可以使用重新定义此方法

type(x).__del__ = my_safe_cleanup_method  

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python:集群作业管理 - python

我在具有两个阶段的计算群集(Slurm)上运行python脚本,它们是顺序的。我编写了两个python脚本,一个用于阶段1,另一个用于阶段2。每天早上,我检查所有第1阶段的工作是否都以视觉方式完成。只有这样,我才开始第二阶段。通过在单个python脚本中组合所有阶段和作业管理,是否有一种更优雅/自动化的方法?我如何知道工作是否完成?工作流程类似于以下内容:w…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…

Python:传递记录器是个好主意吗? - python

我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…