A long time has passed since I last wrote a Singleton. Definitively, we rarely write singleton patterns in Python because we can represent singletons as variables in a module, and import them everywhere - see my strategy for logging library wide.
However, how should we construct a singleton class which represents a state that is initialized (loaded/read) together with the class first instantiation and for which we don't want the whole loading process to be repeated in case the singleton class is instantiated again at a different stage of the runtime?
Well, here it is:
class MyClass: _state = None def __new__(cls, *args, **kwargs): if cls._state: print('State already exists, returning existing state.') return cls._state elif cls._state is None: cls._state = super().__new__(cls) return cls._state def __init__(self, arg): self.arg = 1 a = AmberTopology(1) print(a.arg) # 1 b = AmberTopology(2) print(b.arg) # 1 assert a is b # True
Enjoy and Cheers,