昔書いたコードを見直しすると、むずむずしてきて面白いですね!
Python で Singletonを実現するためのコードの変遷を書きます。
1年前は、if文よりtryを使うのと、__slots__=()が、個人的な流行でした。
Python2.7だと、ifとtryはどっちが早いんだろ?
class Singleton(object): u"""lambdaによるシングルトンの実装 初回だけ__new__,__init__を実行しつつ、 2回目の呼び出しでは何もしないように処理を上書きする。 if文も例外も使っていないから、結構速いんじゃね? """ __slots__=() def __new__(cls, *args, **kwds): instance = super(Singleton, cls).__new__(cls, *args, **kwds) cls.__init__(instance, *args, **kwds) cls.__new__ = staticmethod(lambda *args, **kwds: instance) cls.__init__ = lambda self, *args, **kwds: None return instance
class Singleton(object): u"""lambdaによるシングルトンの実装 def __init__(self):のみOK。パラメータ指定はダメ! 前の仕様だと2回目の__new__で、 *args, **kwdsが無視されるのがわかり辛い。 """ __slots__=() def __new__(cls): instance = super(Singleton, cls).__new__(cls) cls.__init__(instance) cls.__new__ = staticmethod(lambda _cls: instance) cls.__init__ = lambda _self: None return instance
from samplemodule import HOGECLASS_INSTANCE # Pythonの仕組みに任せてOK. # モジュールは1回しかよばれない=Singleton
class hoge(object): def __init__(self): self.hogehoge = 1 HOGECLASS_INSTANCE = hoge()
成長するにしたがって、だんだんシンプルな書き方になってますね!
まぁ結局、Singletonパターンって、pythonだとあんまり必要ないですね(orz)。
目鱗でした。ありがとう。
返信削除