О единственной причине, по которой вы должны использовать __del__
, - помочь сборщику мусора собрать больше мусора.Например, если вы реализуете что-то вроде модуля ctypes
, который присоединяет разделяемые библиотеки к запущенному процессу, имеет смысл выгружать эти библиотеки, когда собрана последняя ссылка на него, чтобы его адресное пространство могло использоваться для чего-то другого..
Для управления другими видами ресурсов вы почти наверняка не хотите иметь ничего общего с сборщиком мусора.Правильный инструмент для этого - контекстные менеджеры .В отличие от языков, таких как C ++ или Ada, где для RAII используется переменная область действия, python использует оператор with
вместе с объектом, который имеет методы __enter__
и __exit__
.Многие встроенные типы Python используют этот точный механизм, чтобы удостовериться, что шаги завершения действительно выполняются:
>>> x = file("foo", 'w')
>>> x.closed
False
>>> with x:
... x.write("bar")
...
>>> x.closed
True
Это также ценно с точки зрения дзен питона:
Явное лучше, чем неявное.
, потому что ясно, что происходит очистка, оно явно написано именно так.Это намного лучше, чем случай, когда очистка происходит «волшебным образом», когда какая-то скрытая переменная (счетчик ссылок, если он существует, а в PyPy, IronPython или Jython) не достигает определенного значения, может быть.