CPython использует подсчет ссылок и запускает только полноценный GC (который удаляет циклические ссылки) время от времени, c = C(); del c
вызовет новый C
, чтобы сразу же получить gc, да.Что касается __del__
и выхода интерпретатора, в документах говорится :
Не гарантируется, что методы __del__()
вызываются для объектов, которые все еще существуют при выходе из интерпретатора.
Но, кажется, невозможно быть уверенным.Плюс (по общему признанию, это не имеет большого значения в практическом плане), другие реализации, такие как Jython и IronPython, не используют подсчет ссылок = уничтожение / завершение объекта менее предсказуемо (или - в теории - может вообще не произойти, по крайней мере, в .NET).
В любом случае: это требование (выполнение __del__
только при нормальном gc, а не при выходе из интерпретатора) действительно пахнет.Не могли бы вы уточнить, почему вам нужно позаботиться об этом?
Возможно, вам понадобится менеджер контекста .