Python のクロージャとレキシカル変数を使ったシングルトンっぽいもの

2010/01/31 6:26pm

実際にはシングルトンではなくて、共有インスタンスを返すメソッドを実装する、ってだけなんだけど。

class A(object):

    @staticmethod
    def shared():
        instance = A()
        A.shared = staticmethod(lambda: instance)
        return instance
  1. 共有インスタンスとなるオブジェクトを生成し、レキシカル変数にバインドする
  2. このオブジェクトを返す無名関数で、元の関数 shared を置き換える

何が嬉しいかというと、共有インスタンスを参照するための変数(今回の場合は instance)を関数外から不可視にできること。変数のスコープが必要以上に広いと不安になります。実行時に遅延インスタンス化されるのが嫌なら、クラス定義の直後に一度呼び出すなりすればいいと思う。

gist:290628 に doctest とか追加したものを置いてあります。