![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
yesint |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 15.1.2007 Репутация: 1 Всего: 1 |
Доброго времени суток!
Возник (как у новичка) такой вопрос: Есть некий объект, который хранит в себе список других объектов: class A: def __init__(self): self.L = [] def addItem(self): temp = classB() self.L.append(temp) return(temp) В програме стоит такое: a = A() item1 = a.addItem() Задача: нужно каким-то образом сделать так, что при удалении переменной item1 удалялась и ссылка из списка внутри экземпляра а т.е. чтобы сам объект физически удалялся. Сколько не бился не нашел как это сделать. Возможно ли такое и как? Зарание спасибо! |
|||
|
||||
albertn |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
Можно сделать чуток подругому. В список помещать оригинальный объект, а возвращать ссылку на этот объект, в котором указан исходный объект со списком и оригинальный элемент. Потом прото переопределяем метод __del__, и удаляем этот элемент из списка.
Единственный недостаток, что обращаться к оригинальному элементу придется через original. Хотя от этого можно избавиться при помощи переопределенных функций, которые будут обращаться к оригинальному объекту.
|
|||
|
||||
DrDred |
|
||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 14.9.2006 Где: Земля Репутация: 2 Всего: 2 |
Решение разделяется на 2 части: - сначала немного меняем метод addItem
-- потом в classB переопределяем метод __del__
|
||||
|
|||||
setq |
|
|||
Unregistered |
Мне кажется, лучше воспользоваться модулем weakref
|
|||
|
||||
albertn |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
DrDred, Основная проблема в том, что метод __del__ запускается только после того, как все ссылки на этот объект будут уничтожены, а нужно, чтобы после удаления локальной (глобальной) переменной происходило удаление и из списка. А в твоем методе из списка она сама никогда не удалится.
|
|||
|
||||
DrDred |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 14.9.2006 Где: Земля Репутация: 2 Всего: 2 |
Согласен. Просто данная задача в условиях GC практически нерешаема. Т.е. чтобы объект прибился бы GC, на него не должно быть ссылок, а чтобы на него не было ссылок, его нужно сначала удалить из листа. Замкнутый круг... Либо, как уже подсказали выше, помещать в спиок не сам объект, а weakref на него... |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Python: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |