Estoy tratando de entender las partes internas del recolector de basura CPython, específicamente cuando se llama al destructor. Hasta el momento, el comportamiento es intuitivo, pero el siguiente caso me provoca:¿Por qué se llama al destructor cuando el recolector de basura CPython está deshabilitado?
- Deshabilitar el GC.
- Crea un objeto y luego quita una referencia al mismo.
- El objeto se destruye y se llama al método _____del_____.
Pensé que esto solo ocurriría si el recolector de basura estuviera habilitado. ¿Alguien puede explicar por qué sucede esto? ¿Hay alguna manera de diferir llamando al destructor?
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()
responsabilidad: este código no es para la producción - Ya he señalado que esto es muy aplicación específica y no funciona en Jython.
¿Está documentada esta implementación de "dos recolectores de basura" en alguna parte? – Frederik
Eche un vistazo a la respuesta de Alex Martelli y sus enlaces asociados. Probablemente sea mejor que cualquier otra cosa que se me ocurra. –