Python:@staticmethod和@property

Pau*_*jan 38 python singleton properties

我想要

Stats.singleton.twitter_count += 1
Run Code Online (Sandbox Code Playgroud)

而我以为我能做到

class Stats:
    singleton_object = None

    @property
    @staticmethod
    def singleton():
        if Stats.singleton_object:
            return Stats.singleton_object
        Stats.singleton_object = Stats()
        return Stats.singleton()
Run Code Online (Sandbox Code Playgroud)

但它引发了一个例外:

>>> Stats.singleton.a = "b"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'property' object has only read-only attributes (assign to .a)
Run Code Online (Sandbox Code Playgroud)

小智 66

就最初的问题而言,用户kaizer.se就已经开始了.我在简单性方面更进了一步,所以它现在只需要一个装饰器:

class classproperty(property):
    def __get__(self, cls, owner):
        return classmethod(self.fget).__get__(None, owner)()
Run Code Online (Sandbox Code Playgroud)

用法:

class Stats:
    _current_instance = None

    @classproperty
    def singleton(cls):
        if cls._current_instance is None:
            cls._current_instance = Stats()
        return cls._current_instance
Run Code Online (Sandbox Code Playgroud)

如上所述,这种创建单例的方式不是一个好的设计模式; 如果必须这样做,元类工厂是一个更好的方法.我对于一个阶级财产的前景感到很兴奋,所以,就是这样.

  • 考虑到赞成票,为什么这不是第一个列出的答案?它工作完美并达到目的,上面的答案没有帮助。谢谢。 (3认同)

Joc*_*zel -24

单身人士在蟒蛇中毫无意义.

class A:
  class_var = object()

# two objects
a, b = A(), A()

# same var everywhere
assert a.class_var is b.class_var is A.class_var
Run Code Online (Sandbox Code Playgroud)

Python的ints与简单objects不同,所以它并不总是那么简单.但就你的目的而言,这似乎已经足够了:

class Stats:
    twitter_count = 0

Stats.twitter_count +=1
Stats.twitter_count +=1
assert Stats.twitter_count == 2
Run Code Online (Sandbox Code Playgroud)

  • 你们都听到人们说静态方法和单例在Python,yadda,yadda中毫无意义.那是废话.Singleton是一种有效的,需要的模式.大型编程社区想要知道的是"我们"应该如何以"正确的方式"做到这一点.任何没有直接回答的答案,我认为都是无益的.我是一个人,对这个问题感到难过.:-) 救命! (101认同)
  • "单人在蟒蛇中毫无意义." 这是一个非常通用的注释,并将单例作为语义概念和python作为编程语言进行混合.这有点像说"在英格兰喝咖啡毫无意义",当你真的意味着在英国喝咖啡并不像在美国那么普通. (15认同)
  • 我同意其他人所说的,单例是一种有效的模式,并且在描述软件中应该只有一个实例的实体时非常有用。我经常看到将某些东西描述为Pythonic,以便为糟糕的软件实践合理化。 (3认同)