Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 26, 2008 20:24:01

kost-bebix
От:
Зарегистрирован: 2007-12-28
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс для синглтона

Здравствуйте. Хочу сделать, чтоб если класс синглтон (singleton) можно было не писать каждый раз

class A:
__single = None
def __init__(self):
# Singleton
if self.__class__.__single:
raise self.__class__.__single
self.__class__.__single = self
А просто наследовать уже готовый класс Singleton:

class A(Singleton):
pass
Вопрос: возможно ли это?



Офлайн

#2 Фев. 27, 2008 09:03:06

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс для синглтона

можно, но надо будет каждый раз в потомке вызывать инит предка. Я нашел вот такой пример с метаклассами, выглядит красиво, если надо, можно модифицировать под свои нужды:

class Singleton(type):
def __init__(cls, *args, **kw):
super(Singleton,cls).__init__(*args, **kw)
cls.instance = None
def __call__(cls, *args, **kw):
if cls.instance is None:
cls.instance = super(Singleton,cls).__call__(*args,**kw)
return cls.instance

#example:
class C:
__metaclass__ = Singleton

c1 = C()
print c1

c2 = C()
print c2


<__main__.C object at 0x00ABA950>
<__main__.C object at 0x00ABA950>
И ещё к прочтению: http://www.garyrobinson.net/2004/03/python_singleto.html



Отредактировано (Фев. 27, 2008 09:13:05)

Офлайн

#3 Фев. 27, 2008 12:04:39

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Класс для синглтона

kost-bebix
Здравствуйте. Хочу сделать, чтоб если класс синглтон (singleton) можно было не писать каждый раз
А просто наследовать уже готовый класс Singleton:
class A(Singleton):
pass

Вопрос: возможно ли это?
Очень даже возможно, при чем без метаклассов:
>>> class Singleton(object):
… __single = None
… def __new__(cls, *args, **kwargs):
… if cls.__single:
… raise Exception
… else:
… cls.__single = cls
… return cls

>>> class A(Singleton):
… pass

>>> class B(Singleton):
… pass

>>> a = A()
>>> aa = A()
Traceback (most recent call last):
File “<interactive input>”, line 1, in ?
File “<interactive input>”, line 5, in __new__
Exception
>>> b = B()
>>> bb = B()
Traceback (most recent call last):
File “<interactive input>”, line 1, in ?
File “<interactive input>”, line 5, in __new__
Exception
Тот же функционал можно было вынести и в инит, но в этом случае пришлось бы в каждом наследнике перевызывать конструктор родительского класса.



Офлайн

#4 Март 5, 2008 13:03:26

jan2ary
От:
Зарегистрирован: 2006-11-21
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс для синглтона

Вместо исключения одиночка должен возвращать экземпляр себя, созданный ранее.



Офлайн

#5 Март 5, 2008 13:23:52

playpauseandstop
От:
Зарегистрирован: 2007-10-31
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс для синглтона

jan2ary
Вместо исключения одиночка должен возвращать экземпляр себя, созданный ранее.
подписываюсь



Офлайн

#6 Март 6, 2008 03:37:20

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Класс для синглтона

Не подписываюсь!
Синглетон - один из самых неоднозначных шаблонов проектирования. При возможности следует его избегать.
Как правило, подразумевают нечто вечное, создающееся без параметров и всегда годное к использованию.
Александреску предлагал феникс, уничтожающийся и возникающий опять при попытке обратиться.
Каждый трактует в силу своего разумения.

Похоже, синглетон стоит отнести к антипаттернам и рекомендовать избегать его, если получается.
В GoF он попал исключительно в силу распространенности.
Но при здравом рассмотрении это очень слабый шаблон проектирования, ведущий к многим проблемам при неясных деталях использования и многочисленных побочным эффектам.

Использование синглетонов сильно осложняет тестирование (те же Банда Четырех, Бек, Фаулер, Александреску и Саттер, да и мой собственный опыт).

Стоит считать его испрользование признаком слабого дизайна (либо синглетон перерастает себя, являясь выражением более глубокого подхода - и тогда уже не важен разгово о способах его создания/получения).



Офлайн

#7 Март 6, 2008 05:09:58

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Класс для синглтона

Хороший готовый вариант синглетона - питоновский модуль ;)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#8 Март 6, 2008 11:27:42

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Класс для синглтона

О!!!
Точно! Как-то я упустил это из виду.
Тем более что использование модуля не заставляет писать лишнее и не создает излишних иллюзий.
Если “в тему” - то просто и лаконично.
Если “уродливо” - то столь же наглядно вся уродливость вылезает наружу.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version