2013-11-07 2 views
2

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

class MyClass: 
    def __init__(self, param1, param2): 
     self.param1 = param1 
     self.param2 = param2 

    def getData(self, date): 
     return # here goes the query result converted to dict 

Теперь, если я хотел бы иметь несколько функций, в том классе, который получает некоторые частные часто используемые вещи из этой базы данных:

def getT(self, date): 
     return self.getData(date)['temperature'] 

    def getP(self, date): 
     return self.getData(date)['pressure'] 

Проблемы вот если бы я хотел запросить температуру, а затем давление, он должен выполнить запрос дважды. Как я могу избежать этого? Является ли дизайн неправильным?

+0

Если вы используете python 3.2, вы можете использовать 'functools.lru_cache'. – HYRY

+0

@HYRY Отредактированные теги: Я использую python 2.7. – sashkello

ответ

3

Кэш результатов запроса по дате в экземплярах объекта. Что-то вроде этого:

class Myclass: 
    def __init__(self, param1, param2): 
     self.param1 = param1 
     self.param2 = param2 
     self._datacache = {} 

    def getData(self, date): 
     if date not in self._datacache: 
      self._datacache[date] = # here goes the query result converted to dict 
     return self._datacache[date] 

Возможны варианты, но это основная идея. С этой версией ваши другие геттеры могут работать так, как вы их написали. Или вы можете просто работать непосредственно с результатами запроса.

+1

Побей меня. Хотя я бы добавил кеширование в getData, таким образом кеширование было бы прозрачным для других функций. – korylprince

+0

Да, ты прав. Отредактировано для этого. –

Смежные вопросы