Python имеет как подсчет ссылок сборщик мусора, так и циклический сборщик мусора, и именно последний контролирует модуль gc
. Подсчет ссылок не может быть отключен, и, следовательно, все еще происходит, когда циклический сборщик мусора выключен.
Поскольку после ref = None
не осталось ссылок на ваш объект, его метод __del__
вызывается в результате того, что счетчик ссылок становится равным нулю.
В документации есть подсказка : "Поскольку сборщик дополняет подсчет ссылок, уже используемый в Python ..." (мой акцент).
Вы можете остановить срабатывание первого утверждения, заставив объект ссылаться на себя, чтобы его счетчик ссылок не обнулялся, например, задав ему этот конструктор:
def __init__(self):
self.myself = self
Но если вы сделаете это, сработает второе утверждение. Это связано с тем, что циклы мусора с __del__
методами не собираются - см. Документацию для gc.garbage .