1. 重載__new__方法python
class Singleton(object): def __new__(cls, *args, **kwargs): ''' A pythonic singleton ''' if '_inst' not in vars(cls): cls._inst = super().__new__(cls, *args, **kwargs) return cls._inst def __init__(self, *args, **kwargs): pass
2. 使用裝飾器this
class SingletonDecorator(object): def __init__(self, cls): self._cls = cls self._inst = None def __call__(self, *args, **kwargs): ''' Over __call__ method. So the instance of this class can be called as a function. ''' if not self._inst: self._inst = self._cls(*args, **kwargs) return self._inst class DemoCls(object): pass DemoCls = SingletonDecorator(DemoCls) # After this the DemoCls is bind with a SingletonDecorator instance a = DemoCls() b = DemoCls()
3. 利用python管理module的機制code
---- 在每一個python進程中,module都是惟一的即單例(不論在哪裏import, import 幾回)進程
import sys class MyCls(object): def __init__(self, *args, **kwargs): pass sys.modules[__name__] = MyCls() # After this statement, the test module is bind with a MyCls instance # If you import this module in other module, # test is a MyCls instance actually.
4. share instance property
共享 __dict__ 便可。it