- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
乍一看,Python 的 __del__
特殊方法似乎提供了与 C++ 中的析构函数相同的优势。但是根据 Python 文档 (https://docs.python.org/3.4/reference/datamodel.html),不能保证您的对象的 __del__
方法会被调用!
It is not guaranteed that
__del__
() methods are called for objects that still exist when the interpreter exits.
所以也就是说,方法没用!不是吗?可能会或可能不会被调用的 Hook 函数实际上并没有多大用处,因此 __del__
没有提供任何关于 RAII 的信息。如果我有一些必要的清理工作,我不需要它在某些时候运行,哦,当 GC 真正需要它时,我需要它可靠地、确定性地运行100% 的时间。
我知道 Python 提供了上下文管理器,这对于该任务更有用,但为什么要保留 __del__
呢?有什么意义?
最佳答案
__del__
是终结器。它不是析构函数。终结器和析构器是完全不同的动物。
析构函数被可靠地调用,并且只存在于具有确定性内存管理的语言(例如 C++)中。 Python 的上下文管理器(with
语句)在某些情况下可以实现类似的效果。这些是可靠的,因为对象的生命周期是精确固定的;在 C++ 中,当对象被显式delete
d 或退出某个作用域时(或者当智能指针响应自身的销毁而删除它们时),对象就会死亡。那就是析构函数运行的时候。
终结器调用不可靠。终结器的唯一有效用法是 an emergency safety net (注意:本文是从 .NET 的角度编写的,但概念翻译得相当好)。例如,open()
返回的文件对象在结束时自动关闭。但是你仍然应该自己关闭它们(例如使用 with
语句)。这是因为对象是由垃圾收集器动态销毁的,垃圾收集器可能会或可能不会立即运行,并且对于分代垃圾收集,它可能会或可能不会在任何给定的传递中收集某些对象。由于没有人知道我们将来会发明什么样的优化,因此最安全的假设是您无法知道垃圾收集器何时开始收集您的对象。这意味着您不能依赖终结器。
在 CPython 的特定情况下,由于使用了引用计数(这比垃圾收集更简单和更可预测),您可以获得稍微更强的保证。如果您可以确保您永远不会创建涉及给定对象的引用循环,那么该对象的终结器将在可预测的时间点(当最后一个引用死亡时)被调用。这仅适用于 CPython、引用实现,不是 PyPy、IronPython、Jython 或任何其他实现。
关于python - Python 中的 RAII : What's the point of __del__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28300946/
为什么这不返回每个社区(边界框)中的点数? import geopandas as gpd def radius(points_neighbour, points_center, new_field_
嘿! 我有一张图片,我想在该图片上选择一个点并告诉它应该变换到哪个坐标。我想为一些数字点做这个。当我完成时,整个图像会发生变化,因此会考虑局部性。 最重要的是,我可以选择任意多的点,并且所选的点会转换
我有代码: class Point3D{ protected: float x; float y; float z; public:
我正在开发我的第一个 Spring Boot + Spring Data JPA + Hibernate 5,在 PostgreSQL 上工作数据库。 我在尝试映射具有 point 作为数据类型的字段
当我尝试编译这个简单的代码时,我在构造函数中遇到了两个错误:“类型值不能用作默认参数”我该如何解决这个问题? public class PointerArgs { public P
当我尝试编译这个简单的代码时,我在构造函数中遇到了两个错误:“类型值不能用作默认参数”我该如何解决这个问题? public class PointerArgs { public P
目前我正在实现一项提供集体旅行的交通服务,但我遇到了一个问题: 假设我在下图中得到了点 G = {A,B,C,D,F,R,W} =>。 当用户选择 from(A) -> to(W) 时,它们之间有点:
我有一个名为 Shop 的实体,它有一个名为 Position 的 DBGeorgpraphy 列 数据库中的示例商店的位置值为 POINT (145.034242 -37.825519) 我正在尝试
我看了几个类似的帖子,但我要么不明白他们提供的是什么,要么他们似乎不适用。我是新来的,我会尽力遵守规则。 我们在类(class)的最后 2 周学习 c++,期末学习 40 小时 :),所以我是初学者。
我正在使用 tf2 将点从源帧转换为目标帧。下面是代码片段: import tf2_ros import tf2_geometry_msgs transform = tf_buffer.lookup_
我需要找到一种算法,根据给定的一组大小为 n 的点 S 计算凸包。我知道 S 正好有 6 个点 构成了凸包。 最好和最有效的方法是什么? 我想从 S 生成所有可能的点组合(这将是 n 选择 6 个点)
我有一个在屏幕坐标中的 CGPoint。我还有一个应用了变换矩阵(缩放、旋转和平移)的 CALayer。 如何将屏幕坐标中的点转换为图层的局部坐标? 最佳答案 CALayer 有执行此操作的方法,请在
我正在创建自定义控件,它将从点列表(或数组)中绘制形状。我已经完成了基本的绘图功能,但现在我正在为 Visual Studio 中的设计时支持而苦苦挣扎。 我创建了两个属性: private Poin
此函数是从“JavaScript:权威指南”复制的,但由于某种原因它不起作用... **points.dist = function () { ^ ReferenceError: 点未定义**我对此很
我有一个像这样的自定义适配器: private List items = new ArrayList<>(); private Context context; public UserSpinnerA
代码: UPDATE tbl_name SET points = points + 1 WHERE 'GAME 1' LIKE "%Vikes%" GAME 1 列包含包含 Vikes
我有一个点。我正在尝试将 x 作为 int。如果我使用 Point.x,我将得到 x 作为 int。但我的印象是我应该尽可能使用 setter/getter ( Why use getters and
我正在开发一个小型信誉系统,但遇到了一个问题。 因此,在我的示例中,我想为 4 种不同类型的用户创建一个图片网站;我们称他们为:业余、好、非常好、专业。 每个用户可以上传一张图片,这张图片可以被其他用
我有一个关于事件形状模型的问题。我正在使用 T. Coots 的论文(可以找到 here 。) 我已经完成了所有初始步骤(Procrustes 分析计算平均形状,PCA 减少尺寸)但仍停留在拟合上。
Android moving Image one point (0,0) to another point (30,400). using animation or normal looping co
我是一名优秀的程序员,十分优秀!