在运行时动态覆盖__getitem__?

时间:2013-07-08 02:07:17

标签: python-2.7 object magic-methods

我有一个实现缓存方案的简单类(class Cache(object):,即新类型)。缓存中的查找通过__getitem__进行。现在我想实现一种方法来完全禁用缓存(每次都有效地生成内容),并设置一个实例变量self.disabled来表示该条件。

现在的想法是,__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无济于事。

1 个答案:

答案 0 :(得分: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))