import weakref weakref.ref(object[, callback])
object
- исходный объект,callback
- функция обратного вызова.Функция ref()
модуля weakref
возвращает слабую ссылку на объект object
. Исходный объект можно получить, вызвав объект object
, если слабая ссылка на объект еще существует.
Если объект слабой ссылки удален, то его вызов приведет к возвращению None
. Если предусмотрен обратный вызов callback
и объект слабой ссылки все еще существует, то при его завершении (удалении или при сборка мусора) будет сделан этот обратный вызов. Обратному вызову callback
будет передан объект слабой ссылки object
в качестве единственного параметра и после этого он больше не будет доступен.
Допускается создание множества слабых ссылок для одного и того же объекта object
. Обратные вызовы callback
, зарегистрированные для каждой слабой ссылки, будут вызываться от самого последнего зарегистрированного обратного вызова до самого старого зарегистрированного обратного вызова.
Исключения, вызванные обратным вызовом, будут отмечены на стандартном выходе ошибки, но не будут распространятся. Эти исключения обрабатываются точно так же, как и исключения, вызванные методом объекта __del__()
.
Слабые ссылки могут быть хешируемыми, если сам объект хешируем. Они сохраняют значение хеш-функции даже после удаления объекта. Если функция hash()
вызывается в первый раз только после удаления объекта, то этот вызов поднимет исключение TypeError
.
Объект имеет один атрибут.
__callback__
:Этот атрибут только для чтения, возвращает функцию обратного вызова, в настоящее время связанную со слабой ссылкой.
Если обратного вызова нет или объект слабой ссылки больше не существует, то этот атрибут будет иметь значение None
.
>>> import weakref >>> class Object: ... pass ... >>> o = Object() >>> r = weakref.ref(o) >>> o2 = r() >>> o is o2 # True >>> del o, o2 >>> print(r()) # None
Конструктор weakref.ref()
принимает необязательную функцию обратного вызова, которая вызывается при удалении ссылочного объекта.
import weakref class Talk(): def __init__(self, say): self.say = say def says(self): print(f'Hello {self.say}!') # функция обратного вызова def collback(ref): print(f'Is collback => {ref}') talk = Talk('world') call = talk.says ref = weakref.ref(call, collback) print('call:', call) print('ref:', ref) print('ref():', ref()) # вызываем call по слабой ссылке ref()() print('=> Удаляем:') del call print('=> Проверяем:') print('ref():', ref())
Обратный вызов получает ссылочный объект в качестве аргумента после того, как ссылка "мертва" и больше не ссылается на исходный объект. Одним из применений этой функции является удаление объекта со слабой ссылкой из кэша.
call: <bound method Talk.says of <__main__.Talk object at 0x7f833a60b320>> ref: <weakref at 0x7f833bcd3e58; to 'method' at 0x7f833be02a88 (says)> ref(): <bound method Talk.says of <__main__.Talk object at 0x7f833a60b320>> => Вызываем `call` по `ref`: Hello world! => Удаляем: Is collback => <weakref at 0x7f833bcd3e58; dead> => Проверяем: ref(): None