Python: как "убить" экземпляр / объект класса?
Я хочу, чтобы класс Роуча "умер", когда он достигает определенного уровня "голода", но я не знаю, как удалить экземпляр. Возможно, я ошибаюсь в своей терминологии, но я хочу сказать, что у меня тонна "тараканов" в окне, и я хочу, чтобы конкретные исчезли полностью.
Я бы показал вам код, но он довольно длинный. У меня есть класс Роуч, добавляемый в список популяции плотвы классов Mastermind.
3 ответа
В общем:
- Каждая переменная привязки -> объект увеличивает счетчик ссылок внутреннего объекта
Есть несколько обычных способов уменьшить ссылку (объект разыменования -> привязка переменной):
- выход из блока кода, в котором объявлена переменная (используется впервые)
- разрушающий объект освободит ссылки на все атрибуты / переменную метода -> ссылки на объекты
- призвание
del variable
также удалит ссылку в текущем контексте
после удаления всех ссылок на один объект (counter==0) он становится хорошим кандидатом для сборки мусора, но не гарантируется, что он будет обработан ( ссылка здесь):
CPython в настоящее время использует схему подсчета ссылок с (опционально) отложенным обнаружением циклически связанного мусора, который собирает большинство объектов, как только они становятся недоступными, но не гарантирует сбор мусора, содержащего циклические ссылки. См. Документацию модуля gc для получения информации об управлении сборкой циклического мусора. Другие реализации действуют иначе, и CPython может измениться. Не полагайтесь на немедленное завершение объектов, когда они становятся недоступными (например, всегда закрывайте файлы).
сколько ссылок на объект существует, используйте sys.getrefcount
модуль для настройки / проверки сборки мусора - gc
GC будет вызывать метод object.__del__ при уничтожении объекта ( дополнительная ссылка здесь)
некоторые неизменяемые объекты, такие как строки, обрабатываются особым образом - например, если две переменные содержат одинаковую строку, возможно, что они ссылаются на один и тот же объект, но некоторые нет - проверяют идентифицирующие объекты, почему возвращается значение из id(...) менять?
идентификатор объекта можно узнать с помощью встроенной функции id
модуль memory_profiler выглядит интересно - Модуль для мониторинга использования памяти программы на Python
Есть много полезных ресурсов для темы, один пример: Найти все ссылки на объект в Python
Вы не можете принудительно удалить объект Python; он будет удален, когда ничто не ссылается на него (или когда он находится в цикле, называемом только элементами в цикле). Вы должны будете сказать своему "Главному разуму" стереть его ссылку.
del somemastermind.roaches[n]
for i,roach in enumerate(roachpopulation_list)
if roach.hunger == 100
del roachpopulation_list[i]
break
Удалите экземпляр, удалив его из списка населения (содержащего все экземпляры плотвы).
Если ваши тараканы - это спрайты, созданные в Pygame, то простая команда.kill удалит экземпляр.