У меня была та же проблема.
я заметил, что это начало происходить, когда я установил приложение KDE от центра программного обеспечения, в моем случае это было Компоновщик Подзаголовка .
, Когда я удалил его, проблема была решена.
Присвоение аргументу или любой другой локальной переменной (barename) не может иметь ЛЮБОЙ эффект вне функции; это относится к вашему self = something
, как и к ЛЮБОМУ другому назначению аргументу (barename) или другой локальной переменной.
Вместо этого переопределите __ new __
:
class Singleton(object):
__instance = None
def __new__(cls):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
cls.__instance.name = "The one"
return cls.__instance
I ' Здесь мы сделали другие улучшения, такие как выкорчевывание глобального класса, класса старого стиля и т. д.
НАМНОГО лучше использовать Borg (он же моносостояние) вместо выбранного вами Highlander (он же синглтон), но это другая проблема, чем та, о которой вы спрашиваете; -).
Фрагмент кода Брюса Эккеля из шаблона проектирования: я не понимаю, как это работает
class Borg:
_shared_state = {}
def __init__(self):
self.__dict__ = self._shared_state
class MySingleton(Borg):
def __init__(self, arg):
Borg.__init__(self)
self.val = arg
def __str__(self): return self.val
x = MySingleton('sausage')
print x
y = MySingleton('eggs')
print y
z = MySingleton('spam')
print z
print x
print y
print ´x´
print ´y´
print ´z´
output = '''
sausage
eggs
spam
spam
spam
<__main__. MySingleton instance at 0079EF2C>
<__main__. MySingleton instance at 0079E10C>
<__main__. MySingleton instance at 00798F9C>
'''
Из Шаблон синглтона (Python) :
class Singleton(type):
def __init__(self, name, bases, dict):
super(Singleton, self).__init__(name, bases, dict)
self.instance = None
def __call__(self, *args, **kw):
if self.instance is None:
self.instance = super(Singleton, self).__call__(*args, **kw)
return self.instance
class MyClass(object):
__metaclass__ = Singleton
print MyClass()
print MyClass()
Это самый простой синглтон, который вы можете создать. Он использует метод класса , чтобы проверить, был ли создан синглтон, и создает новый, если нет. Есть более продвинутые способы решения этой проблемы, такие как переопределение метода __ 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 __
.
self = _instance
Это не будет делать то, что вы от него ожидаете. Прочтите о том, как Python обрабатывает имена.