Sto cercando di capire l'interno del garbage collector CPython, in particolare quando viene chiamato il distruttore. Finora, il comportamento è intuitivo, ma il caso seguente mi fa saltar su:Perché viene chiamato il distruttore quando il garbage collector CPython è disabilitato?
- Disabilitare il GC.
- Creare un oggetto, quindi rimuovere un riferimento ad esso.
- L'oggetto viene distrutto e viene chiamato il metodo _____del_____.
Ho pensato che questo sarebbe successo solo se il garbage collector era abilitato. Qualcuno può spiegare perché questo accade? C'è un modo per rimandare chiamando il distruttore?
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()
Esonero di responsabilità: questo codice non è pensato per la produzione - ho già notato che questo è molto implementazione specifici e non funziona su Jython.
È questa implementazione "due garbage collector" documentata da qualche parte? – Frederik
Dai un'occhiata alla risposta di Alex Martelli e ai suoi collegamenti associati. Probabilmente è meglio di qualsiasi altra cosa potrei inventarmi. –