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