昔書いたコードを見直しすると、むずむずしてきて面白いですね!
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)。
目鱗でした。ありがとう。
返信削除