Нет необходимости в quit()
(при условии, что вы используете C -based python).
Python использует два метода сборки мусора, как указано в других ответах.
Во-первых, есть подсчет ссылок . По сути, каждый раз, когда вы добавляете ссылку на объект, она увеличивается, и каждый раз, когда вы удаляете ссылку (например, выходит за пределы области видимости), она уменьшается.
From https://devguide.python.org/garbage_collector/:
Когда счетчик ссылок объекта становится равным нулю, объект освобождается. Если он содержит ссылки на другие объекты, их счетчики ссылок уменьшаются. Эти другие объекты могут быть освобождены по очереди, если этот декремент сделает их счетчик ссылок равным нулю и т. Д.
Вы можете получить информацию о текущих счетчиках ссылок для объекта, используя sys.getrefcount(x)
, но на самом деле , зачем заморачиваться.
Второй способ через сборку мусора (gc
). [Подсчет ссылок - это тип сборки мусора, но python специально называет этот второй метод «сборкой мусора», поэтому мы также будем использовать эту терминологию. ] Это предназначено для поиска тех мест, где счетчик ссылок не равен нулю, но объект больше не доступен. («Циклы ссылок») Например:
class MyObj:
pass
x = MyObj()
x.self = x
Здесь x
относится к самому себе, поэтому фактическое количество ссылок для x больше 1. Вы можете вызвать del x
, но это просто удалит его. из вашей области действия: он живет, потому что «кто-то» все еще ссылается на него.
gc
, а конкретно gc.collect()
проходит через объекты, ищущие такие циклы, и, когда он находит недостижимый цикл ( например, ваше x
удаление сообщения), он освободит весь лот.
Вернемся к вашему вопросу: вам не нужно иметь объект quit (), потому что, как только ваш объект MyImageProcessor
будет вне области действия, он уменьшит счетчики ссылок для image
и metadata
. Если это обнуляет их, они освобождаются. Если этого не происходит, что ж, их использует кто-то другой.
Сначала вы устанавливаете для них значение «Нет», просто уменьшает счетчик ссылок сразу после , но когда MyImageProcessor
выходит за пределы области видимости, он не будет снова уменьшать счетчик ссылок, потому что MyImageProcessor не дольше хранит изображения или объекты метаданных! Итак, вы просто явно делаете то, что python делает для вас уже бесплатно: ни больше, ни меньше.
Вы не создали цикл, поэтому ваш вызов gc.collect()
вряд ли что-то изменит.
Проверьте https://devguide.python.org/garbage_collector/, если вас интересуют более земные подробности.