Python Singleton(シングルモード)実装

1388 ワード

1.リロード_new__方法
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.アクセサリーを使う
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管理の仕組み
----各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__ できます.