0

キャッシング スキームを実装する単純なクラス (class Cache(object):つまり、新しい型) があります。キャッシュ内のルックアップは、 を通じて行われ__getitem__ます。ここで、キャッシュを完全に無効にするメソッドを実装したいと思い (毎回オンザフライでコンテンツを効果的に生成する)、self.disabledその条件を通知するインスタンス変数を設定していました。

今のアイデアは、__init__やるべきことでした:

if self.disabled:
    self.__dict__['__getitem__'] = self.disabled___getitem__

残念ながら、それは効果がありません。別の形式を使用すると、同じことが起こります。

if self.disabled:
    self.__getitem__ = self.disabled___getitem__

動作するかどうかを確認するにはどうすればよいですか? 基本的に、 のデフォルト バージョンに__getitem__は次のような行があります。

if self.disabled:
    raise RuntimeError("This mustn't get called when the cache is disabled!")

使用されるはずのものにはその行がありません。

に変更class Cache(object):するclass Cache:と、空のアイテムが得られましたが、例外もありませんでした。

__getitem__実行時に動的に適切にオーバーライドするにはどうすればよいですか?

注:この回答も試してみましたが、役に立ちませんでした。

4

1 に答える 1

0

それは間違った方法です。次の場合は、代わりに__getitem__変更をその動作にする必要がありself.disabledます。

class Cache(object):

    def __getitem__(self, item):
        if not self.disabled:
            if ((ITEM_IS_CACHED)):
                return ((VALUE))
        # Cache miss, or cache disabled
        ((CALCULATE_ITEM))
        return ((VALUE))
于 2013-07-08T02:20:59.397 に答える