Общее удаление объекта в python

1

Есть ли способ убедиться, что когда объект удален, он полностью удаляется из любого места, где бы он ни находился?

Например, если вы сделали что-то вроде:

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.

Можно ли достичь такого поведения, которое было бы таким?

  • 0
    Я принял все ответы на все мои вопросы, которые получили ответы, которые отвечают на проблему
Теги:
class
global

3 ответа

4
Лучший ответ

В некоторых случаях вы можете использовать слабые ссылки. Если вам все равно, останется ли 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.

  • 0
    Похоже, что он идет в правильном направлении, но я не могу заставить его работать, как это объяснено в документации, например pastebin.com/BsximMga, есть ли какая-то определенность относительно того, когда будет запущен сборщик мусора
  • 0
    @Гуго, см. Мои правки. Вам на самом деле нужно создать оболочку с более слабой ссылкой, срок действия которой вы хотите истечь.
Показать ещё 1 комментарий
2

Нет. Вы удаляете имя, а не фактический объект. Нет причин или механизмов, чтобы вызвать уничтожение объекта (и другие имена удалены), когда удалено только одно имя.

  • 0
    Я знал, что это только удалило имя, поэтому я спрашивал, есть ли какой-либо способ, которым функциональность могла быть достигнута
1

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

Возможно, вы хотите освободить некоторые внешние ресурсы, которые использует ваш объект. Не используйте для этого удаление объекта (__del__ не является деконструктором!) - вместо этого используйте протокол диспетчера контекста (так называемый оператор with). Я не могу думать о какой-либо другой причине, чтобы попробовать это...

  • 0
    Причина, по которой я пытаюсь это сделать, заключается в том, что в программе, над которой я работаю, у меня есть система узлов, которая состоит из общего класса менеджера, класса узла и класса ссылок, и у меня возникают проблемы, при которых попытка удаления ссылки все еще будет оставить ссылки на него в таких местах, как менеджер и точечные объекты

Ещё вопросы

Сообщество Overcoder
Наверх
Меню