我想了解CPython垃圾收集器的内部,特别是当析构函数被调用时。到目前为止,这种行为很直观,但下面的案例让我想起了:为什么在CPython垃圾回收器被禁用时调用析构函数?
- 禁用GC。
- 创建一个对象,然后删除对它的引用。
- 该对象被销毁并调用了_____del_____方法。
我认为这只会发生,如果垃圾回收器被启用。有人能解释为什么发生这种情况吗有没有办法推迟调用析构函数?
import gc
import unittest
_destroyed = False
class MyClass(object):
def __del__(self):
global _destroyed
_destroyed = True
class GarbageCollectionTest(unittest.TestCase):
def testExplicitGarbageCollection(self):
gc.disable()
ref = MyClass()
ref = None
# The next test fails.
# The object is automatically destroyed even with the collector turned off.
self.assertFalse(_destroyed)
gc.collect()
self.assertTrue(_destroyed)
if __name__=='__main__':
unittest.main()
声明:此代码并不意味着用于生产 - 我已经指出,这是非常特定的实施和Jython中不起作用。
这个“两个垃圾收集器”的实现记录在某处吗? – Frederik 2010-04-05 12:42:48
看看Alex Martelli的回答及其相关链接。这可能比我能想出的其他任何东西都要好。 – 2010-04-05 17:45:41