LINUX.ORG.RU

[python] удаление из списка. сигналы pygtk.

 


0

0

Прошу прощения у меня еще 2 вопроса про питон:
1) Как внутри объекта удалить все ссылки на него?
У объекта A Есть словарь объектов. В этом словаре есть объект B.
Чтобы внутри B удалить его самого из словаря в A приходится при создании B передавать ссылку на A, чтобы потом сделать:
del self.a_link.list[self.key]
ну, можно вызвать ф-ю из A, но все равно нужна ссылка.
Как реализовать нормально? Также как реализовать нормально, если B в нескольких списках?

2) Если установить обработчики сигналов gtk ( widget.connect("signal",callback) ) на методы объекта, то объект нельзя удалить пока не будут удалены виджеты, либо не будут отвязаны сигналы (disconnect).
Приходится делать виджетам destroy().

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

★★★★★

1) Вообще не понял, что у тебя за чудесатая архитектура такая. Возможно, тебе поможет модуль weakref.

2) есть метод __del__, который вызывается при подчистке объекта сборщиком мусора.

anonymous4
()
Ответ на: комментарий от anonymous4

>2) есть метод __del__, который вызывается при подчистке объекта сборщиком мусора.
Так он и не вызывается,т.к. объект не удаляется, т.к. есть widget.connect(...)

ls-h ★★★★★
() автор топика
Ответ на: комментарий от ls-h

Очевидно, тебе нужно отцеплять обработчики от виджетов явно. Что мешает-то?

anonymous4
()
Ответ на: комментарий от anonymous4

>1) Вообще не понял, что у тебя за чудесатая архитектура такая.
Ну, есть объект. Он встречается в нескольких словарях.
Как уничтожить объект не удаляя ссылки на него из всех, т.к. не удобно перебирать. (чтобы они сами удалились)?
Что-нибудь типа:
del self
- но это не работает, просто удаляет self.

ls-h ★★★★★
() автор топика
Ответ на: комментарий от ls-h

>(чтобы они сами удалились)?

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

anonymous4
()
Ответ на: комментарий от ls-h

>Как уничтожить объект не удаляя ссылки на него из всех, т.к. не удобно перебирать.

Хотя есть такой грязный хак как gc.get_referrers()... Но я бы таки посоветовал воздержаться от таких вариантов.

anonymous4
()
Ответ на: комментарий от teferiincub

Ну почитай хелп про эту функцию.

>Avoid using get_referrers() for any purpose other than debugging.

Он применим только если ты пишешь, скажем, отладчик. Или какое другое средство для рантаймового анализа состояния интерпретатора. Если у тебя основная логика построена на запросе у сборщика мусора информации об объекте -- у тебя что-то очень сильно не так в устройстве приложения. От хорошей жизни такие подходы не применяют.

anonymous4
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.