Сообщить об ошибке.

Функция ref() модуля weakref в Python

Создать слабую ссылку на объект

Синтаксис:

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