Python 中的 RAII:__del__ 有什么意义?

2024-01-22

乍一看,好像是Python的__del__特殊方法提供了与 C++ 中析构函数几乎相同的优点。但根据Python文档(https://docs.python.org/3.4/reference/datamodel.html https://docs.python.org/3.4/reference/datamodel.html), 有没有保证你的对象是__del__方法根本不会被调用!

不保证__del__() 方法是为解释器退出时仍然存在的对象调用的。

那么也就是说,这个方法是没有用的!不是吗?一个可能被调用也可能不会被调用的钩子函数确实没有多大用处,所以__del__没有提供任何有关 RAII 的信息。如果我有一些必要的清理工作,我不需要它来运行一些时间,哦,每当 GC 感觉真的如此时,我就需要它运行可靠、确定且 100% 成功.

我知道 Python 提供了上下文管理器,这对于该任务来说更有用,但为什么__del__留在身边吗?重点是什么?


__del__是一个终结器。它不是析构函数。终结器和析构器是完全不同的动物。

析构函数被可靠地调用,并且仅存在于具有确定性内存管理的语言(例如 C++)中。 Python 的上下文管理器(with声明)在某些情况下可以达到类似的效果。这些是可靠的,因为物体的寿命是精确固定的;在 C++ 中,对象在显式声明时就会消亡deleted 或者当退出某个作用域时(或者当智能指针响应其自身的破坏而删除它们时)。这就是析构函数运行的时候。

终结器未被可靠地调用。终结器的唯一有效用途是紧急安全网 https://blogs.msdn.microsoft.com/oldnewthing/20100809-00/?p=13203(注意:本文是从 .NET 角度编写的,但概念翻译得相当好)。例如,返回的文件对象open()完成后自动关闭。但你仍然应该自己关闭它们(例如使用with陈述)。这是因为对象是由垃圾收集器动态销毁的,垃圾收集器可能会也可能不会立即运行,并且通过分代垃圾收集,它可能会也可能不会在任何给定的传递中收集某些对象。由于没有人知道我们将来可能会发明什么样的优化,因此最安全的假设是您无法知道垃圾收集器何时会收集您的对象。这意味着您不能依赖终结器。

在 CPython 的特定情况下,由于使用了引用计数(这比垃圾收集更简单且更可预测),您可以获得稍微更强的保证。如果您可以确保永远不会创建涉及给定对象的引用循环,则该对象的终结器将在可预测的点(当最后一个引用消失时)被调用。这是onlyCPython 的真实情况,参考实现,以及notPyPy、IronPython、Jython 或任何其他实现的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的 RAII:__del__ 有什么意义? 的相关文章

随机推荐

  • 为什么我要在 NHibernate 会话之上使用工作单元模式?

    我什么时候会在 NHibernate 已经提供的内容之上编写一个 UoW 实现 有现实世界的例子吗 您所描述的工作单元已经由 NHibernate 提供 因此没有理由执行这样的工作单元 我们在 WCF 服务中拥有的是更高级别的工作单元 其中
  • 在 Primefaces 4 中显示格式化的十进制数字 [重复]

    这个问题在这里已经有答案了 我有一个带有浮点字段的数据库表 我想通过 Primefaces 显示它 我想显示格式为 例如一千 的数字 1 000 00 我试过
  • 如何针对使用 matplotlib 的代码编写单元测试?

    我正在开发一个 python 2 7 程序 它生成许多不同的 matplotlib 图形 数据不是随机的 我愿意实施一些测试 使用单元测试 以确保生成的数字是正确的 例如 我将预期的图形 数据或图像 存储在某个地方 运行我的函数并将结果与
  • 如何控制库类的 Jackson 序列化

    我有一堂课 让我们称之为Piece 包含类型的成员com jme3 math ColorRGBA 使用默认的 Jackson 序列化 成员不仅被序列化为其成员r g b and a 但也使用像这样的吸气剂getAlpha 由于这显然是多余的
  • 切换多个 case 语句

    有人可以建议我如何替换下面的代码吗 如何重写代码以避免块的重复case 3 code block A break switch i case 1 code block A break case 2 code block b break ca
  • 如何避免执行更新的更新触发器中的递归?

    我需要使用触发器更新记录中货物的 vat total sum 但是触发触发器来更新记录并陷入递归 我怎样才能避免这种情况 代码 CREATE OR REPLACE FUNCTION vat total sum RETURNS TRIGGER
  • 将字符串数组发送到 Web API 方法

    这是我的客户端 ajax 调用 var list a b c d var jsonText data list ajax type POST url api scheduledItemPriceStatus updateStatusToDe
  • gprof 没有输出

    我正在尝试使用 gprof 来分析我正在开发的一些数字代码 但 gprof 似乎无法从我的程序中收集数据 这是我的命令行 g Wall O3 g pg o fftw test fftw test cpp lfftw3 lfftw3 thre
  • 蓝牙适配器不会停止扫描 BLE 设备

    在我的应用程序中 我有开始和停止按钮 当用户按下开始时 我调用 startScan 方法 bluetoothAdapter getBluetoothLeScanner startScan getLeScanCallback 当用户按停止时
  • 如何循环遍历数据库的表?

    我试图使用以下代码循环数据库的表 但出现错误java lang UnsupportedOperationException 我什至尝试过cfloop query and other attributes出现错误复杂值无法转换为简单值 谁能告
  • Lua 无法计算 math.abs(29.7 - 30) <= 0.3 [重复]

    这个问题在这里已经有答案了 今天早上我在我的 Lua 脚本中发现了一个错误 这看起来很奇怪 这次评估怎么会失败呢 示例可以在以下位置进行测试here http www lua org cgi bin demo 第一个例子 if math a
  • 为什么 Golang 强制大括号不在下一行?

    correct if true 不正确 if true 为什么要强制执行这种样式 它与语言规范有关 还是只是因为他们更喜欢一种样式而不是另一种样式 为什么有大括号但没有分号 为什么我不能将左大括号放在下一行 Go 使用大括号进行语句分组 这
  • 格式化numpy数组中的浮点数[重复]

    这个问题在这里已经有答案了 如果我有一个像这样的 numpy 数组 2 15295647e 01 8 12531501e 00 3 97113829e 00 1 00777250e 01 如何移动小数点并格式化数字 这样我最终会得到一个像这
  • 如何将 fgetcsv 与字符串一起使用[重复]

    这个问题在这里已经有答案了 如何使用fgetcsv其中输入是字符串而不是资源 如何将字符串转换为资源 fgetcsv需要文件句柄资源 str 1981 2992 19191 n392 488 299 n some ntext 199 222
  • 无法拉伸内部 StackPanel

    使用下面的设置 我可以将窗口的整个宽度着色为紫色 内部堆叠面板为黄绿色 并移至左侧
  • 在 Rails 3.2 中禁用解释

    是否可以通过配置全局禁用 Rails 3 2 中的新解释功能 我正在使用 activerecord sqlserver adapter 3 2 1 并且 gem 的解释 显示计划 部分似乎存在一些错误 引用自http weblog ruby
  • 从 C# 以编程方式创建文件到 Onedrive?

    我想从 C 直接创建 doc docx pptx 或 excel 文件到我的 Onedrive 帐户 我已经尝试过这个 但它对我不起作用 有人知道我做错了什么吗 谢谢 public async Task
  • 是否可以部署独立的 .NET Framework 应用程序?

    我正在开发一个使用 Net Framework 的 C Net 应用程序 但当用户在其计算机上安装该应用程序时遇到问题 他们中的一些人只是不知道如何安装 Net Framework 我正在寻找这个问题的解决方案 并且我发现了 Net Cor
  • 如何使用变量而不是文件来让任何命令写入?

    我在用着curl cookie jar
  • Python 中的 RAII:__del__ 有什么意义?

    乍一看 好像是Python的 del 特殊方法提供了与 C 中析构函数几乎相同的优点 但根据Python文档 https docs python org 3 4 reference datamodel html https docs pyt