2015-05-26 1 views
1

Я хочу memoize результат функции в классе:как memoize результат функции в python?

class memoize: 
    def __init__(self, function): 
     self.function = function 
     self.memoized = {} 

    def __call__(self, *args): 
     try: 
      return self.memoized[args] 
     except KeyError, e: 
      self.memoized[args] = self.function(*args) 
      return self.memoized[args] 

class DataExportHandler(Object): 
    ... 

    @memoize 
    def get_province_id(self, location): 
     return search_util.search_loc(location)[:2] + '00000000' 

    def write_sch_score(self): 
     ... 
     province_id = self.get_province_id(location) 

, но это не работает, потому что он говорит мне, что get_province_id takes exactly 2 arguments(1 given)

+0

как вы его используете? –

+0

@XiaotianPei Я обновляю вопрос, я просто использую его в этом классе – roger

+0

Возможный дубликат: http://stackoverflow.com/questions/1988804/what-is-memoization-and-how-can-i-use-it-in -python –

ответ

0

Есть несколько примеров Memoizing декораторов here, которые являются стоит взглянуть на. Второй и третий примеры, я думаю, вероятно, лучше рассмотрят проблемы с методами vs functions.

-1

Функция-член не может использовать класс декоратора, вы должны использовать функцию декоратора:

def memoize1(obj): 
    cache = obj.cache = {} 

    @functools.wraps(obj) 
    def memoizer(*args, **kwargs): 
     key = str(args) + str(kwargs) 
     if key not in cache: 
      print 'not in cache' 
      cache[key] = obj(*args, **kwargs) 
     else: 
      print 'in cache' 
     return cache[key] 
    return memoizer