Python·100 вопросов

Что такое weakref и когда он полезен?

Ответ

Модуль weakref в стандартной библиотеке Python предоставляет разработчикам механизм создания так называемых слабых ссылок на объекты, которые не увеличивают счетчик ссылок и не препятствуют удалению целевого объекта сборщиком мусора.

Это означает, что если на определенный объект больше не ссылаются обычные сильные переменные, Python имеет полное право уничтожить его из памяти, даже если на него все еще указывают слабые ссылки из модуля weakref.

Данный инструмент оказывается чрезвычайно полезным в нескольких типичных сценариях разработки.

Создание кэшей результатов ресурсоемких функций, где вы хотите хранить ранее вычисленные значения, но не желаете, чтобы кэш удерживал объекты в памяти навсегда, если они больше не нужны основной программе.
Реализация паттерна проектирования Наблюдатель, когда издатель событий хранит список подписчиков в виде слабых ссылок, позволяя объектам-подписчикам удаляться без необходимости ручной отписки.
Работа с большими графами объектов со сложными и циклическими связями, где жесткие ссылки могут приводить к утечкам памяти, которые не может автоматически разрешить стандартный сборщик мусора.
Использование специализированных коллекций WeakKeyDictionary и WeakValueDictionary, которые автоматически удаляют пары ключ-значение, как только соответствующие ключи или значения перестают существовать в других частях программы.

Однако применять weakref следует с осторожностью, поскольку в момент обращения к слабой ссылке объект уже может быть удален сборщиком мусора, что вернет значение None и потребует от разработчика обязательной проверки на этот случай в коде.

Полезен ли этот ответ?

Другие вопросы этой темы

Связанные вопросы из других тем