Одиночный элемент Python / возражает инстанцированию

У меня была та же проблема.

я заметил, что это начало происходить, когда я установил приложение KDE от центра программного обеспечения, в моем случае это было Компоновщик Подзаголовка .

, Когда я удалил его, проблема была решена.

6
задан JonahSan 1 September 2009 в 18:10
поделиться

5 ответов

Присвоение аргументу или любой другой локальной переменной (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 (он же синглтон), но это другая проблема, чем та, о которой вы спрашиваете; -).

22
ответ дан 8 December 2019 в 02:35
поделиться

Фрагмент кода Брюса Эккеля из шаблона проектирования: я не понимаю, как это работает

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>
'''
6
ответ дан 8 December 2019 в 02:35
поделиться

Из Шаблон синглтона (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()
4
ответ дан 8 December 2019 в 02:35
поделиться

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

3
ответ дан 8 December 2019 в 02:35
поделиться
self = _instance

Это не будет делать то, что вы от него ожидаете. Прочтите о том, как Python обрабатывает имена.

0
ответ дан 8 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: