Python のクロージャとレキシカル変数を使ったシングルトンっぽいもの
実際にはシングルトンではなくて、共有インスタンスを返すメソッドを実装する、ってだけなんだけど。
class A(object):
@staticmethod
def shared():
instance = A()
A.shared = staticmethod(lambda: instance)
return instance
- 共有インスタンスとなるオブジェクトを生成し、レキシカル変数にバインドする
- このオブジェクトを返す無名関数で、元の関数 shared を置き換える
何が嬉しいかというと、共有インスタンスを参照するための変数(今回の場合は instance
)を関数外から不可視にできること。変数のスコープが必要以上に広いと不安になります。実行時に遅延インスタンス化されるのが嫌なら、クラス定義の直後に一度呼び出すなりすればいいと思う。
gist:290628 に doctest とか追加したものを置いてあります。