Что не так с этим синглтоном? - PullRequest
1 голос
/ 26 августа 2011

В настоящее время я использую довольно упрощенную реализацию синглтона.Однако я никогда не видел в Интернете ничего подобного этому, что наводит меня на мысль, что с этим может быть что-то не так ...

class Singleton:
    def __init__():
        raise ...

    @staticmethod
    def some():
        pass

    @staticmethod
    def another():
        pass

Есть ли какие-либо недостатки в этой реализации синглтона (сделать все ученики статичными).Это похоже на использование модулей в качестве синглетонов, за исключением того, что вы оборачиваете все в классе.


Редактировать: Я знаю о других способах реализации синглетонов вPython.Что мне не нравится в них, так это то, что ни один из них не является явным (что противоречит дзену Python):

Поскольку я делаю a = Class() вместо чего-то вроде a = Class.Instance(), не очевидно, что яЯ имею дело с объектом с общим состоянием (см. примечание № 1).Если все члены статичны, у меня, по крайней мере, Class.someMethod(), что вроде как говорит о том, что это синглтон.Что мне не нравится в этом подходе, так это то, что вы не можете использовать конструкторы и деструкторы, что устраняет основное преимущество, которое имеют синглтоны, перед свободными функциями, что вы можете делать при их создании и уничтожении (см. Примечание № 2)..

Примечание № 1: Я знаю, что мне наплевать на состояние синглтона (если я это сделаю, то это не должен быть синглтон в первую очередь).Я по-прежнему хочу, чтобы в нем было явно указано, что это за класс.

Примечание № 2: Когда вы создаете синглтон, вы можете выполнить его создание в конструкторе.Например, в синглтоне, который имеет дело с графической библиотекой, вы можете инициализировать библиотеку в constrctor.Таким образом, создание и удаление объекта происходит автоматически в конструкторах и деструкторе синлетона.
Или в ResourceManager: деструктор может проверить, есть ли при его разрушении ресурсы в памяти, и действовать соответствующим образом.
Если вы используете свободные функции вместосинглтоны, все это нужно делать вручную.

Ответы [ 5 ]

11 голосов
/ 26 августа 2011

Да, это синглтон, вот что с ним не так. Если вы собираетесь сделать все методы статичными, не беспокойтесь о создании класса, просто используйте бесплатные функции.

2 голосов
/ 26 августа 2011

Это не синглтон.Это глобальная коллекция методов без сохранения состояния, заключенная в тип.

В этом нет ничего плохого, если только вы не уверены, что это синглтон.

Синглтон предполагает только один экземпляр.

1 голос
/ 26 августа 2011

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

Шаблон Борга - это что-то свое, здесь каждый экземпляр имеет одинаковые атрибуты.Алекс Мартелли, изобретатель шаблона borg, выступил на Europython 2011 с докладом о том, что Гвидо ван Руссому не нравится шаблон borg, но не сказал, почему.

  1. вы можете создать из него подкласс
  2. , если вы проведете рефакторинг своего кода и решите, что вам нужны другие экземпляры, изменение кода будет минимизировано.
1 голос
/ 26 августа 2011

Мы борг! Таким образом, состояние является общим для каждого экземпляра объекта.

class Borg(object):
    state = {}
    def __init__(self):
        self.__dict__ = self.state

a = Borg()
a.a = 34
b = Borg()
print b.a
c = Borg()
c.c = "haha"
print a.c

Просто процитирую оригинал

1 голос
/ 26 августа 2011

Нельзя издеваться, поэтому трудно проверить.

Вот в чем дело.

На самом деле наличие 1 объекта тестируемого класса считается лучшей практикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...