Есть ли способ убедиться, что когда объект удален, он полностью удаляется из любого места, где бы он ни находился?
Например, если вы сделали что-то вроде:
A = NewObject()
B = NewObject()
C = NewObject()
List1 = [A,B,C]
List2 = [1,2,3,C]
del A
del List2[3]
и удалять объекты там, где они есть, что означает, что List1
будет содержать только B и что List2
будет содержать только 1,2,3.
Можно ли достичь такого поведения, которое было бы таким?
В некоторых случаях вы можете использовать слабые ссылки. Если вам все равно, останется ли C
в List2
, вы можете обернуть его в weakref, и когда ссылка на C
истечет из List1, сборщик мусора соберет любую связанную с ним память.
Python использует подсчет ссылок для того, чтобы решить, нужно ли собирать объект, так что пока ссылка где-то хранится, вы не можете полностью удалить этот объект. Однако, если weakref обертывает объект, эта ссылка не учитывается. Поэтому, когда счетчик падает до 0, он будет собираться при удобстве GC.
Убедитесь, что вы полностью прочитали документацию, так как существует множество предостережений, связанных со слабыми ссылками. В частности, типы объектов, которые могут быть использованы в слабомref.
Изменить:
Пример -
>>> class List(list):
... pass
...
>>> weaklist = List()
>>> weaklist.append('a')
>>> weaklist.append('b')
>>> stronglist = [ ['c','d','e'] ]
>>> weaklist
['a', 'b']
>>> stronglist
[['c', 'd', 'e']]
>>> import weakref
>>> stronglist.append(weakref.ref(weaklist))
>>> stronglist
[['c', 'd', 'e'], <weakref at 0x10046e578; to 'List' at 0x100455f70>]
>>> stronglist[1]()
['a', 'b']
>>> del weaklist
>>> stronglist
[['c', 'd', 'e'], <weakref at 0x10046e578; dead>]
>>> stronglist[1]()
>>>
Я очень советую прочитать всю документацию по weakrefs. Похоже, вы хотите создать структуру node, но сможете ссылаться на эту структуру node из Менеджера. Вы должны создавать свои узлы как обычные объекты, но размещать слабые ссылки для этих объектов в Менеджере. Таким образом, когда a node удаляется, ссылка в Менеджере просто умирает.
Кандидатом для этого будет WeakValueDictionary
, определенный в модуле weakref.
Нет. Вы удаляете имя, а не фактический объект. Нет причин или механизмов, чтобы вызвать уничтожение объекта (и другие имена удалены), когда удалено только одно имя.
Не пытайтесь это сделать, это не сработает. Структурируйте свою программу таким образом, чтобы объекты автоматически удалялись, когда они больше не нужны.
Возможно, вы хотите освободить некоторые внешние ресурсы, которые использует ваш объект. Не используйте для этого удаление объекта (__del__
не является деконструктором!) - вместо этого используйте протокол диспетчера контекста (так называемый оператор with
). Я не могу думать о какой-либо другой причине, чтобы попробовать это...