Позвонил один раз или 1000 раз. Я не проинформирован о распространении данных в домене OP, извините :)

аюсь создать декоратор для метода экземпляра класса, который запомнит результат. (Это было сделано миллион раз раньше). Однако мне бы хотелось иметь возможность сброса записанного кэша в любой момент (скажем, если что-то в состоянии экземпляра изменится, что может изменить результат, если метод ничего не имеет) делать со своими аргами). Итак, я попытался создать декоратор как класс вместо функции, чтобы у меня был доступ к кешу как члена класса. Это привело меня на путь изучения дескрипторов, особенно__get__ метод, в котором я на самом деле застрял. Мой код выглядит так:

import time

class memoized(object):

    def __init__(self, func):
        self.func = func
        self.cache = {}

    def __call__(self, *args, **kwargs):

        key = (self.func, args, frozenset(kwargs.iteritems()))

        try:
            return self.cache[key]
        except KeyError:
            self.cache[key] = self.func(*args, **kwargs)
            return self.cache[key]
        except TypeError:
            # uncacheable, so just return calculated value without caching
            return self.func(*args, **kwargs)

    # self == instance of memoized
    # obj == instance of my_class
    # objtype == class object of __main__.my_class
    def __get__(self, obj, objtype=None):
        """Support instance methods"""
        if obj is None:
            return self

        # new_func is the bound method my_func of my_class instance
        new_func = self.func.__get__(obj, objtype)

        # instantiates a brand new class...this is not helping us, because it's a 
        # new class each time, which starts with a fresh cache
        return self.__class__(new_func)

    # new method that will allow me to reset the memoized cache
    def reset(self):
        print "IN RESET"
        self.cache = {}

class my_class:
    @memoized
    def my_func(self, val):
        print "in my_func"
        time.sleep(2)
        return val


c = my_class()

print "should take time"
print c.my_func(55)
print

print "should be instant"
print c.my_func(55)
print

c.my_func.reset()

print "should take time"
print c.my_func(55)

Это ясно и / или возможно? Каждый раз__get__ называется, я получаю новый экземпляр памятного класса, который теряет мне кэш с фактическими данными в нем. Я много работал с__get__, но не добиваюсь большого прогресса.

Есть ли совершенно отдельный подход к этой проблеме, который мне совершенно не хватает? И все советы / предложения приветствуются и приветствуются. Благодарю.