Форум сайта python.su
Всех приветствую!
Сама программа небольшая, но там дважды вызывается конфигурационный класс для извлечения некоторых переменных, я подумал будет лучше сделать этот класс синглтоном, чтобы один раз проинициализировав эти переменные, последующие вызовы не затрагивают эти переменные а просто возвращают эти переменные, ну вобщем нашел одну реализацию этого паттерна - Borg, вот пример:
class Borg(object): __shared_state__ = {} def __init__(self): self.__dict__ = self.__shared_state__ class Singletone(Borg): def __init__(self, name=None): super(Singletone, self).__init__() if name: self.name = name obj1 = Singletone('Hello, Borg!") obj2 = Singletone() print(obj1.name, obj2.name)
obj1 = Singletone('Hello, Borg!") del(obj1) print(Singletone().name) # out -> Hello, Borg!
Офлайн
Вообще не понял при чем здесь синглетон
Офлайн
4kpt_IVАну вобщем то да, лишний класс оказался ни кчему:
Вообще не понял при чем здесь синглетон
class Borg(object): __shared_state__ = {} def __init__(self, name=None): self.__dict__ = Borg.__shared_state__ if name: self.name = name obj1 = Borg('Hello') obj2 = Borg() print(obj1.name, obj2.name)
Офлайн
https://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%B8%D0%BD%D0%BE%D1%87%D0%BA%D0%B0_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)#Python
Хотя, создание нескольких объектов того, что должно быть единственным является логической ошибкой, имхо.
Офлайн
а чем такой вариант плох?
__all__ = ('config',) class Config(): pass __config = None def config(): global __config if not __config: __config = Config() return __config
__all__ = ('config',) class Config(): pass config = Config()
Отредактировано PooH (Июль 17, 2016 17:33:18)
Офлайн
lobsterВ классе хранится.
Непонятно где хранится переменная __shared_state__ в каком объекте? Если к примеру попробовать удалить объект, то ничего не выйдет
Офлайн
ShamanДа вообще, использовать синглтон это плохо, примерно также плохо как использовать глобальные переменные в коде.
https://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%B8%D0%BD%D0%BE%D1%87%D0%BA%D0%B0_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)#PythonХотя, создание нескольких объектов того, что должно быть единственным является логической ошибкой, имхо.
PooHНу, до меня дошло, что класс это тоже объект.
В классе хранится.
Отредактировано lobster (Июль 18, 2016 01:00:56)
Офлайн
lobster
Да вообще, использовать синглтон это плохо, примерно также плохо как использовать глобальные переменные в коде.
lobster
Сама программа небольшая, но там дважды вызывается конфигурационный класс для извлечения некоторых переменных, я подумал будет лучше сделать этот класс синглтоном
https://habrahabr.ru/post/125238/В обозначенной ситуации обычно делаю что-то такоеkk86 29 июля 2011 в 19:05
+11
Синглтон — зло, когда применён не к месту. Разве нет?
Doggy 29 июля 2011 в 19:09
+9
. . .
TheShock 29 июля 2011 в 21:48
+1
Проблема в том, что простота этого паттерна стала причиной ПОСТОЯННОГО применения Синглтона не к месту.
Хотя, вот лично я, не могу представить, когда он может быть нужен на практике.
class Initializer: def __init__(self): self.initialized = False def init_by_need(self): if self.initialized: return # do initializations print('Init complete!') self.initialized = True initializer = Initializer() if __name__ == '__main__': for i in range(10): if i in [2, 5]: initializer.init_by_need()
Отредактировано Shaman (Июль 18, 2016 10:10:19)
Офлайн