В настоящее время я использую довольно упрощенную реализацию синглтона.Однако я никогда не видел в Интернете ничего подобного этому, что наводит меня на мысль, что с этим может быть что-то не так ...
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: деструктор может проверить, есть ли при его разрушении ресурсы в памяти, и действовать соответствующим образом.
Если вы используете свободные функции вместосинглтоны, все это нужно делать вручную.