Метод __del__
вызывается, когда счетчик ссылок объекта достигает 0 или когда он перебирается сборщиком мусора в случае циклической ссылки. Например, следующее:
class Foo:
def __del__(self):
print('Foo has been deleted!')
foo = Foo()
del foo
будет правильно вызывать метод __del__
и печатает Foo has been deleted!
, поскольку объект, назначенный foo
, был указан только один раз. Теперь давайте рассмотрим следующий пример:
class Foo:
def __del__(self):
print('Foo has been deleted!')
foo = Foo()
foo.self = foo
del foo
Метод __del__
не будет вызван, потому что foo.self
держит себя в заложниках. Он будет удален только при прохождении сборщиком мусора. Например:
from gc import collect
class Foo:
def __del__(self):
print('Foo has been deleted!')
foo = Foo()
foo.self = foo
del foo
collect()
Будет вызван метод __del__
, потому что мы сказали сборщику пересечь ожидающие объекты. Не рекомендуется, но вы можете указать Python обойти всю очередь, установив пороговые значения 1. Например:
from gc import set_threshold
set_threshold(1, 1, 1)
class Foo:
def __del__(self):
print('Foo has been deleted!')
foo = Foo()
foo.self = foo
del foo
Таким образом, каждый раз, когда создается один объект, сборщик будет запускать его. Но опять же, не рекомендуется, так как это может быть дорогостоящим и повлиять на производительность вашего кода.