Форум сайта python.su
Здравствуйте. Хочу сделать, чтоб если класс синглтон (singleton) можно было не писать каждый раз
class A:
__single = None
def __init__(self):
# Singleton
if self.__class__.__single:
raise self.__class__.__single
self.__class__.__single = self
class A(Singleton):
pass
Офлайн
можно, но надо будет каждый раз в потомке вызывать инит предка. Я нашел вот такой пример с метаклассами, выглядит красиво, если надо, можно модифицировать под свои нужды:
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>
Отредактировано (Фев. 27, 2008 09:13:05)
Офлайн
kost-bebixОчень даже возможно, при чем без метаклассов:
Здравствуйте. Хочу сделать, чтоб если класс синглтон (singleton) можно было не писать каждый раз
А просто наследовать уже готовый класс Singleton:
class A(Singleton):
pass
Вопрос: возможно ли это?
Офлайн
Вместо исключения одиночка должен возвращать экземпляр себя, созданный ранее.
Офлайн
jan2aryподписываюсь
Вместо исключения одиночка должен возвращать экземпляр себя, созданный ранее.
Офлайн
Не подписываюсь!
Синглетон - один из самых неоднозначных шаблонов проектирования. При возможности следует его избегать.
Как правило, подразумевают нечто вечное, создающееся без параметров и всегда годное к использованию.
Александреску предлагал феникс, уничтожающийся и возникающий опять при попытке обратиться.
Каждый трактует в силу своего разумения.
Похоже, синглетон стоит отнести к антипаттернам и рекомендовать избегать его, если получается.
В GoF он попал исключительно в силу распространенности.
Но при здравом рассмотрении это очень слабый шаблон проектирования, ведущий к многим проблемам при неясных деталях использования и многочисленных побочным эффектам.
Использование синглетонов сильно осложняет тестирование (те же Банда Четырех, Бек, Фаулер, Александреску и Саттер, да и мой собственный опыт).
Стоит считать его испрользование признаком слабого дизайна (либо синглетон перерастает себя, являясь выражением более глубокого подхода - и тогда уже не важен разгово о способах его создания/получения).
Офлайн
Хороший готовый вариант синглетона - питоновский модуль ;)
Офлайн
О!!!
Точно! Как-то я упустил это из виду.
Тем более что использование модуля не заставляет писать лишнее и не создает излишних иллюзий.
Если “в тему” - то просто и лаконично.
Если “уродливо” - то столь же наглядно вся уродливость вылезает наружу.
Офлайн