1

我正在为 C++ 程序的 swig 接口构建一个 Python 包装器。

我很想知道 Python 对象是否有办法“知道”它是如何被删除的。这个想法很简单,如果垃圾收集器删除了对象,则包装器不会对底层 C++ 对象做任何事情,但如果用户故意删除了对象(``del 对象),那么包装器会检测到该对象并取消引用底层对象,以便它也被删除。

我已经尝试过用谷歌搜索,但找不到任何东西。我发现的唯一一件事是(显然)__del__被垃圾收集器和del命令调用,并且似乎无法区分是哪个调用它。

希望有人证明我错了!

4

1 回答 1

2

CPython 使用引用计数来跟踪对象的生命周期。因此,所有删除都由垃圾收集器完成。

例如,下面的代码创建了两个引用;在删除对该对象的第二次引用后,该__del__挂钩仅被调用一次:

>>> class Foo(object):
...     def __del__(self):
...         print "Bye bye!"
... 
>>> spam = Foo()
>>> bar = spam
>>> del spam
>>> del bar
Bye bye!

因此,无法通过钩子检测单个del语句;__del__它总是只被垃圾收集器调用。

请注意,某些 python 实现(尤其是 cpython)不会__del__使用作​​为循环依赖的一部分的钩子清除对象。这并不适用于所有实现,但值得记住。

在任何情况下,使用引用计数来实现对象删除和垃圾回收本身就是一个实现细节,非 CPython 实现可以(并且确实)完全不同地处理对象删除。

于 2012-09-22T23:15:54.790 回答