Python对象删除检测

时间:2012-09-22 23:07:14

标签: c++ python oop wrapper swig

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

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

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

希望有人证明我错了!

1 个答案:

答案 0 :(得分: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实现可以(并且确实)完全不同地处理对象删除。