Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как удалить все ссылки на объект? 
:(
    Опции темы
yesint
Дата 15.1.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 удалялась и ссылка из списка внутри экземпляра а т.е. чтобы сам объект физически удалялся.
Сколько не бился не нашел как это сделать. 
Возможно ли такое и как?

Зарание спасибо!
PM MAIL   Вверх
albertn
Дата 15.1.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Можно сделать чуток подругому. В список помещать оригинальный объект, а возвращать ссылку на этот объект, в котором указан исходный объект со списком и оригинальный элемент. Потом прото переопределяем метод __del__, и удаляем этот элемент из списка.
Единственный недостаток, что обращаться к оригинальному элементу придется через original. Хотя от этого можно избавиться при помощи переопределенных функций, которые будут обращаться к оригинальному объекту.
Код

class classB:
    def __del__(self):
        print "Оригинал на \"%s\" удален" % (self.value,)

    def __init__(self,value):
        self.value = value

class classC:
    def __del__(self):
        print "Ссылка на \"%s\" удалена" % (self.original.value,)
        try:
            self.parent.L.remove(self.original)
        except:
            print "Оригинал в базе не обранужен"

    def __init__(self,parent,original):
        self.parent = parent
        self.original = original

class A:
    def __init__(self):
        self.L = []

    def addItem(self):
        temp = classB('Тескт')
        self.L.append(temp)
        clone = classC(self,temp)
        return (clone)

a = A()
item1 = a.addItem()
print "------------------"
print a.L
print "------------------"
del item1
print "------------------"
print a.L
print "------------------"

PM WWW ICQ   Вверх
DrDred
Дата 15.1.2007, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 14.9.2006
Где: Земля

Репутация: 2
Всего: 2



Цитата(yesint @  15.1.2007,  12:35 Найти цитируемый пост)
Задача: нужно каким-то образом сделать так, что при удалении переменной item1 удалялась и ссылка из списка внутри экземпляра а т.е. чтобы сам объект физически удалялся.
Сколько не бился не нашел как это сделать. 
Возможно ли такое и как?


Решение разделяется на 2 части:
- сначала немного меняем метод addItem
Код

def addItem(self):
    temp = classB()
    temp.backlink = self
    self.L.append(temp)
    return temp


-- потом в classB переопределяем метод __del__
Код

def __del__(self):
    if (self.backlink != None): self.backlink.remove(self)

PM MAIL WWW ICQ   Вверх
setq
Дата 15.1.2007, 22:41 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мне кажется, лучше воспользоваться модулем weakref
  Вверх
albertn
Дата 16.1.2007, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



DrDred, Основная проблема в том, что метод __del__ запускается только после того, как все ссылки на этот объект будут уничтожены, а нужно, чтобы после удаления локальной (глобальной) переменной происходило удаление и из списка. А в твоем методе из списка она сама никогда не удалится.
PM WWW ICQ   Вверх
DrDred
Дата 16.1.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 14.9.2006
Где: Земля

Репутация: 2
Всего: 2



Цитата(albertn @  16.1.2007,  10:04 Найти цитируемый пост)
Основная проблема в том, что метод __del__ запускается только после того, как все ссылки на этот объект будут уничтожены, а нужно, чтобы после удаления локальной (глобальной) переменной происходило удаление и из списка. А в твоем методе из списка она сама никогда не удалится. 

Согласен. Просто данная задача в условиях GC практически нерешаема. Т.е. чтобы объект прибился бы GC, на него не должно быть ссылок, а чтобы на него не было ссылок, его нужно сначала удалить из листа. Замкнутый круг...
Либо, как уже подсказали выше, помещать в спиок не сам объект, а weakref на него... 

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.