データキャッシュの場所

5月10日の日記のSingletonを再考してみる。Singleton実装のポイントをまとめると以下の2点である。

  • Singletonオブジェクトをキャッシュするタイミング
  • Singletonオブジェクトをキャッシュする場所


2番目のキャッシュする場所をまとめてみた。以下の3通り存在する。


3番目の例はまだ書いていないので下に例を挙げる。参考文献は昨日の日記でメモしたサイト。

def singleton(object, instantiated=[]):
    "Raise an exception if an object of this class has been instantiated before."
    assert object.__class__ not in instantiated, \
        "%s is a Singleton class but is already instantiated" % object.__class__
    instantiated.append(object.__class__)
    
class YourClass:
    "A singleton class to do something ..."
    def __init__(self, args):
        singleton(self)
        ...

保存場所としては、上の例ではリストを使用しているが、1つのデータしかキャッシュしないので、辞書やリストなど使用しなくても変数にそのものの値を保存しておくだけで十分。保存されていない場合は、値はもちろんNoneにしておけば良い。


まとめると、「名前空間 + 変数」のセットを表現可能なものとしてクラスオブジェクト、インスタンスオブジェクト、クロージャ関数の3つが存在するということ。メモ化(Memoize)もキャッシュするタイミングが違うだけで全く同様な考えで実装可能。モジュールも、同様なセットが表現可能かもしれないが、あまり使い勝手が良くないと思われる。


追記:
データキャッシュに辞書やリストでなくとも良いと書いたが、よく考えてみるとマルチプルなクラスオブジェクトに対応するためには辞書かリストでないとうまくいかない。もっと言えば、リストより辞書の方が効率良いので辞書の方がベターだと思う。