Pythonでシングルトン風な何か

↑を読んでちょっと工夫をした。


先程の記事のコードを改造してクラスに応用する。

class Hoge:
    @classmethod
    def get(cls):
        ret_value = Hoge()
        cls.get = classmethod(lambda cls: ret_value)
        return ret_value

a = Hoge.get()
b = Hoge.get()
a is b # => True

とりあえずは期待通りに動いたらしい。


(と、ここまで書いたが http://www.metareal.org/2010/01/31/python-shared-instance-closure/ にほとんどそのままのコードが載っていた。考えることは同じだったようだ。)


さて、この方式の難点は2つ。

1. Pythonはコンストラクタの呼び出しを制限できない

まあコンストラクタというか属性全般。
頭にアンダースコアをつけることで気持ち程度隠蔽できるが、アクセスできないわけではない。
なので、

c = Hoge()
a is c # => False

このようになる。

2. getterの再上書きを制限できない

以下の通り。

Hoge.get = classmethod(lambda x: 42)

Hoge.get() # => 42


前者はともかく後者は「普通やんねーよ」レベルではあるが、可能なことには変わりがない。
さて、改良の余地はあるだろうか。