0

インスタンス化に比較的費用がかかるいくつかの異なるクラスがあり、それらのメソッドの1つがスローされるまでは正常に機能します。その時点では、状態が何らかの形で混乱しているため、オブジェクトを保持する意味がありません。

私は通常、オブジェクトをインスタンス化する関数をメモ化するだけですが、この場合、メモ化デコレータはインスタンス化時にオブジェクトについてのみ認識し、各メソッド呼び出しについては認識しないため、機能しません。

この問題をどのように解決できますか?すべてのメソッドを個別にラップし、そのうちの1つがスローされたときに新しいオブジェクトをインスタンス化するデコレータを作成することは可能ですか?

4

3 に答える 3

0

インスタンスに「._valid」属性を追加すると、キャッシュから返す前に、それが true かどうかを確認できます。そうでない場合は、キャッシュミスとして扱います。

于 2012-08-31T10:10:47.227 に答える
0

dir(cls)その上にあるすべてのものを取得し、呼び出し可能な各アイテムに try except デコレータを適用するために使用できます...次に、例外をキャッチすると、クラスにフラグを設定し (valid=False)、エラーを発生させます。 .. memoize は、戻る前にそのフラグをチェックします ... フラグがない場合は、単に戻ります ...

少なくともそれが私が考えることができる唯一の方法です...

于 2012-08-30T22:43:54.603 に答える
0

メモライザーには次のような内部機能があると思います。

def memocall(function, *args, **kwargs):
    try:
        return cache[(args, kwargs)]
    except KeyError:
        result = function(*args, **kwargs)
        cache[(args, kwargs)] = result
        return result

それを少し変更して次のようにします。

def memocall(function, *args, **kwargs):
    try:
        return cache[(args, kwargs)]
    except KeyError:
        try: 
            result = function(*args, **kwargs)
        except:
            cache = {}  # Clear the cache
            raise       # Re-throw the exception
        cache[(args, kwargs)] = result
        return result
于 2012-08-30T22:46:10.490 に答える