2013-07-08 3 views
0

У меня есть простой класс (class Cache(object):, т. Е. Новый тип), который реализует схему кэширования. Поиск в кеше происходит через __getitem__. Теперь я хотел реализовать метод, чтобы полностью отключить кеш (эффективно генерировать контент «на лету» каждый раз) и устанавливал переменную экземпляра self.disabled, чтобы сигнализировать об этом состоянии.Динамическое переопределение __getitem__ во время выполнения?

Теперь идея была, в __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__ динамически во время выполнения?

Примечание: Я также пробовал this answer безрезультатно.

+0

Почему бы вы сделали это, что путь вокруг, а не делать '__getitem__' просто не делать чек, если он отключен? –

+0

@ChrisMorgan: потому что проверка этого имущества может быть дорогостоящей в моем случае. Есть причина, даже если я пропущу его, чтобы сделать вопрос более кратким. – 0xC0000022L

+0

Если оператор 'if not self.disabled:' слишком медленный для вашего случая, тогда CPython - неправильная языковая среда для вас. Я предлагаю попробовать писать кеш на C или использовать PyPy. Если вы не знаете, что это слишком медленно из-за того, что вы не пробовали это, это прямо относится к категории преждевременной оптимизации. –

ответ

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)) 
Смежные вопросы