2013-04-18 2 views
0

Я хотел бы иметь одноэлементный класс в Python с Java, например, "static class attributes". Я прочитал несколько сообщений, существующих в синглтонах Python, и не могу найти решение, кроме простого модуля как singleton.Python singleton again/как использовать атрибуты класса?

Есть ли способ продлить этот код (PEP318), чтобы использовать его со «атрибутами статического класса», которые я могу получить от функций?

def singleton(cls): 
    instances = {} 
    def getinstance(): 
     if cls not in instances: 
      instances[cls] = cls() 
     return instances[cls] 
    return getinstance 

@singleton 
class MyClass: 
    ... 
+4

[Singleton? Нам не нужен ни один сингл stinkin: шаблон дизайна Borg (рецепт Python)] (http://code.activestate.com/recipes/66531/) :) –

+0

Комментарий Re @ Paulo, убедитесь, что вы читаете комментарии о новые классы стиля на этой странице. –

+0

Существует множество способов имитации этого эффекта в одном модуле - тривиально, просто создайте класс, а затем запустите фабрику, которая всегда возвращает один и тот же экземпляр (или просто сделайте экземплярную часть пространства имен модуля). Мы все соглашаемся с взрослыми здесь - не нужно хранить вещи в секрете. –

ответ

4

TBH, я всегда считаю, что синглтон является анти-шаблоном.

Если вы хотите объект, который будет когда-либо иметь только один экземпляр, то зачем беспокоиться даже о создании чего-либо? Просто сделайте что-нибудь вроде ...

class MyCounter(object): 
    count = 0 

    @classmethod 
    def inc(cls, delta=1): 
     cls.count += delta 

>>> MyCounter.count 
0 
>>> MyCounter.inc() 
>>> MyCounter.count 
1 
>>> MyCounter.inc(5) 
>>> MyCounter.count 
6 
+0

Спасибо! Декоратором было то, что я искал. – user937284

Смежные вопросы