2012年2月13日月曜日

成長の軌跡:PythonでSingleton実装


昔書いたコードを見直しすると、むずむずしてきて面白いですね!
Python で Singletonを実現するためのコードの変遷を書きます。





1年前のイッシーのコード→【ここ】

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





3か月前のイッシーのコード:
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)。

1 件のコメント: