Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Как удалить обьект


Автор: HellanD 14.9.2006, 10:01
Задача:
Есть класс, создаем обьект этого класа. Фиксируем его создание. И если создастца новый обьект того же класа необходимо просто вывести сообщение "Нельзя создавать два обьекта такого класа" и удалить второй обьект!

Автор: slav0nic 14.9.2006, 11:04
Код

class a:
    pass


x = a()

for i in vars().items():
    print i[0], isinstance(i[1], a)


если тру - то потомок ужо есть, если я прально понял вопрос. Тогда удаляй что хошь

Автор: Cr@$h 14.9.2006, 11:24
Могу говорить на языке шаблонов. Помести в класс частную (private) статическую переменную -- счётчик. В конструкторе увеличивай её значение, начиная с 0. Если конструктор видит, что она уже равна 1, то генери исключение. При создании экземпляров этого класса всегда лови исключения, обрабатывай их, в смысле.

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

Автор: setq 14.9.2006, 11:53
HellanD, в крайнем случае в качестве уникального объекта можно попробовать использовать модуль.

Автор: J2A 14.9.2006, 12:50
Код

class Foo(object):
    __instance = None
    def __new__(cls):
        if cls.__instance is None:
            cls.__instance = object.__new__(cls)
            return cls.__instance
        else:
            raise RuntimeError("Only one instance of Foo allowed")


Код

>>> import foo
>>> f1 = foo.Foo()
>>> f2 = foo.Foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "foo.py", line 16, in __new__
    raise RuntimeError("Only one instance of Foo allowed")
RuntimeError: Only one instance of Foo allowed


Пояснения нужны?

Автор: setq 14.9.2006, 14:09
J2A, циклическая ссылка, однако.

Автор: J2A 14.9.2006, 14:34
В каком месте?

Автор: setq 14.9.2006, 15:02
Код


class Foo...  #См. выше

class Bar(Foo):
    def __del__(self):
        print "Good bye"



Код

>>> b = Bar()
>>> del b
>>>       #Ушёл по-английски

Автор: Artemios 15.9.2006, 09:40
Цитата(setq @  14.9.2006,  15:02 Найти цитируемый пост)
#Ушёл по-английски

Таки сам объект-одиночка не удалился, сидит все там же по ссылке 
Bar._Foo__instance

Автор: Artemios 15.9.2006, 10:11
Интересно, а как от Foo наследовать несколько классов, и каждый из которых имел бы своего объекта-одиночку?

Автор: HellanD 15.9.2006, 10:51
Cr@$h :
Спасибо этот метод мне очень нравиться!!!
Но вот что меня беспокоит: "Как на питоне сделать эту  частную (private) да еще и  статическую переменную -- счётчик
Подскажи плиз"

Автор: J2A 15.9.2006, 11:52
Цитата(Artemios @ 15.9.2006,  13:11)
Интересно, а как от Foo наследовать несколько классов, и каждый из которых имел бы своего объекта-одиночку?

Например, __instances -- список дочерних объектов. Если в __instances есть объект текущего класса ([isinstance(x, cls) for x in cls.__instances]),значит ругаться. Если нет -- добавлять в конец списка.

Автор: Artemios 19.9.2006, 15:32
Еще один симпатичный вариант одиночки:
Код

>>> class A:
    __singleton = {}
    def __init__(self):
        self.__dict__ = A.__singleton

>>> a = A()
>>> a.a = 5
>>> b = A()
>>> b.a
5
>>> 

Автор: Artemios 20.9.2006, 08:43
Здесь: http://python.com.ua/doc/object.html нашел немного более подробно об объектах-одиночках, все наши примеры там уже естьsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)