pythonsingletonproperties

@staticmethod with @property


I want

Stats.singleton.twitter_count += 1

and I thought I could do

class Stats:
    singleton_object = None

    @property
    @staticmethod
    def singleton():
        if Stats.singleton_object:
            return Stats.singleton_object
        Stats.singleton_object = Stats()
        return Stats.singleton()

But it throws an exception:

>>> 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)

Solution

  • Singletons are pointless in python.

    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
    

    Python's ints are differnt from simple objects, so it's not always that simple . But for your purposes, this seems to be enough:

    class Stats:
        twitter_count = 0
    
    Stats.twitter_count +=1
    Stats.twitter_count +=1
    assert Stats.twitter_count == 2