Это самый простой синглтон, который вы можете сделать. Он использует метод класса , чтобы проверить, был ли синглтон создан, и создает новый, если он этого не сделал. Есть более продвинутые способы решения этой проблемы, такие как переопределение метода __new__
.
class Singleton:
instance = None
@classmethod
def get(cls):
if cls.instance is None:
cls.instance = cls()
return cls.instance
def __init__(self):
self.x = 5 # or whatever you want to do
sing = Singleton.get()
print sing.x # prints 5
Что касается того, почему ваш код не работает, есть несколько причин. Во-первых, к тому времени, когда вызывается __init__
, новый объект уже создан, побеждая назначение шаблона синглтона. Во-вторых, когда вы говорите self = __instance
, это просто сбрасывает локальную переменную self; это было бы похоже на высказывание
def f(x):
x = 7 # changes the value of our local variable
y = 5
f(y)
print y # this is still 5
Поскольку переменные в Python передаются по значению, а не по ссылке, вы не можете сказать self = blah
, и он будет иметь смысл так, как вы хотите. Вышеприведенный класс Singleton - это больше, чем вы хотите, если только вы не хотите придумать и изучить переопределение оператора __new__
.