Язык программирования Python

Слабые ссылки


Для обеспечения ассоциаций объектов без свойственных ссылкам проблем с возможностью образования циклических ссылок, в Python для сложных структур данных и других видов использования, при которых ссылки не должны мешать удалению объекта, предлагается механизм слабых ссылок. Такая ссылка не учитывается при подсчете ссылок на объект, а значит, объект удаляется с исчезновением последней "сильной" ссылки.

Для работы со слабыми ссылками применяется модуль weakref. Основные принципы его работы станут понятны из следующего примера:

>>> import weakref >>> >>> class MyClass(object): ... def __str__(self): ... return "MyClass" ... >>> >>> s = MyClass() # создается экземпляр класса >>> print s MyClass >>> s1 = weakref.proxy(s) # создается прокси-объект >>> print s1 # прокси-объект работает как исходный MyClass >>> ss = weakref.ref(s) # создается слабая ссылка на него >>> print ss() # вызовом ссылки получается исходный объект MyClass >>> del s # удаляется единственная сильная ссылка на объект >>> print ss() # теперь исходного объекта не существует None >>> print s1 Traceback (most recent call last): File "<stdin>", line 1, in ? ReferenceError: weakly-referenced object no longer exists

К сожалению, поведение прокси-объекта не совсем такое, как у исходного: он не может быть ключом словаря, так как является нехэшируемым.



Содержание раздела