Próbuję zrozumieć wewnętrzne elementy odśmiecacza CPython, szczególnie gdy wywoływany jest destruktor. Do tej pory zachowanie jest intuicyjne, ale następujący przypadek wywołuje mnie:Dlaczego wywoływany jest destruktor, gdy moduł usuwania śmieci CPython jest wyłączony?
- Wyłącz GC.
- Utwórz obiekt, a następnie usuń odniesienie do niego.
- Obiekt zostanie zniszczony i zostanie wywołana metoda _____del_____.
Pomyślałem, że tak się stanie tylko wtedy, gdy włączony jest garbage collector. Czy ktoś może wyjaśnić, dlaczego tak się dzieje? Czy istnieje sposób na odroczenie wywoływania destruktora?
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()
Uwaga: Ten kod nie jest przeznaczona do produkcji - Ja już zauważyć, że jest to bardzo specyficzne i implementacja nie działa na Jython.
Czy to udokumentowano implementację "dwóch śmieciarzy"? – Frederik
Spójrz na odpowiedź Alexa Martellego i związane z nim linki. To chyba lepsze niż wszystko, co mogłem wymyślić. –