PythonでSingletonパターン
いくつもの方法がある。
モジュールグローバル変数を使う
code:module_global.py
class SomeSingleton:
...
single = SomeSingleton()
これを別モジュールから from module_global import single のように使う
メリット
Pythonの言語仕様を利用しているため、シンプル
多くのプロジェクトがこの方式(のカスタマイズ版)で実装している
shimizukawa.icon一番Pythonらしい書き方 だと思う
デメリット
初期化パラメータを与えられない
タイミングのコントロールがしづらい
SomeSingleton.get_instance() 形式ではない(慣れの問題)
モジュールグローバル変数を使う(カスタム版)
code:module_global.py
class SomeSingleton:
def __init__(self, param):
....
_single = None
def init(param):
global _single
if _single is not None:
raise RuntimeError("SomeSingleton is already initialized. Don't call init twice!")
_single = SomeSingleton(param)
return _single
def get_single():
if _single is None:
raise RuntimeError('SomeSingleton is not initialized yet. Please call init() before call get_single().')
return _single
初期化処理で init(param) を呼ぶ
アプリケーションであれば必ず一定の初期化処理が必要なので、そこで呼ぶ
利用箇所では s = get_single() のようにして取得する
メリット
Pythonの言語仕様を利用しているため、シンプル
多くのプロジェクトがこの方式(のカスタマイズ版)で実装している
shimizukawa.icon一番Pythonらしい書き方 で、実用的な実装だと思う
デメリット
SomeSingleton.get_instance() 形式ではない(慣れの問題)
Singletonクラスを継承する
Borgパターンを使う
code:borg.py
class Borg:
__shared_state = {}
def __init__(self):
self.__dict__ = self.__shared_state
# and whatever else you want in your class -- that's all!
参考