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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как удалить обьект 
V
    Опции темы
HellanD
Дата 14.9.2006, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
slav0nic
Дата 14.9.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.5.2006

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



Код

class a:
    pass


x = a()

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


если тру - то потомок ужо есть, если я прально понял вопрос. Тогда удаляй что хошь
--------------------
                                 python.com.ua 
PM MAIL WWW Jabber   Вверх
Cr@$h
Дата 14.9.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

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



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

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

Это сообщение отредактировал(а) Cr@$h - 14.9.2006, 11:26
PM MAIL ICQ   Вверх
setq
Дата 14.9.2006, 11:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











HellanD, в крайнем случае в качестве уникального объекта можно попробовать использовать модуль.
  Вверх
J2A
Дата 14.9.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

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


Пояснения нужны?
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
setq
Дата 14.9.2006, 14:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











J2A, циклическая ссылка, однако.
  Вверх
J2A
Дата 14.9.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В каком месте?
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
setq
Дата 14.9.2006, 15:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код


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

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



Код

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

  Вверх
Artemios
Дата 15.9.2006, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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


Это сообщение отредактировал(а) Artemios - 15.9.2006, 09:47


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Artemios
Дата 15.9.2006, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
HellanD
Дата 15.9.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
J2A
Дата 15.9.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

Например, __instances -- список дочерних объектов. Если в __instances есть объект текущего класса ([isinstance(x, cls) for x in cls.__instances]),значит ругаться. Если нет -- добавлять в конец списка.
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
Artemios
Дата 19.9.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Еще один симпатичный вариант одиночки:
Код

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

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



--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Artemios
Дата 20.9.2006, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




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


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

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