У меня есть простой класс (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 безрезультатно.
Почему бы вы сделали это, что путь вокруг, а не делать '__getitem__' просто не делать чек, если он отключен? –
@ChrisMorgan: потому что проверка этого имущества может быть дорогостоящей в моем случае. Есть причина, даже если я пропущу его, чтобы сделать вопрос более кратким. – 0xC0000022L
Если оператор 'if not self.disabled:' слишком медленный для вашего случая, тогда CPython - неправильная языковая среда для вас. Я предлагаю попробовать писать кеш на C или использовать PyPy. Если вы не знаете, что это слишком медленно из-за того, что вы не пробовали это, это прямо относится к категории преждевременной оптимизации. –