python – 分配(而不是定义)一个__getitem__魔术方法打破了索引

参见英文答案 > Why won’t dynamically adding a `__call__` method to an instance work?                                    2个
我有一个类似于这个(强烈简化)示例的包装类:

class wrap(object):
    def __init__(self):
        self._data = range(10)

    def __getitem__(self, key):
        return self._data.__getitem__(key)

我可以像这样使用它:

w = wrap()
print w[2] # yields "2"

我以为我可以通过改变这个来优化和摆脱一个函数调用:

class wrap(object):
    def __init__(self):
        self._data = range(10)
        self.__getitem__ = self._data.__getitem__

但是,我收到了

TypeError: ‘wrap’ object does not support indexing

对于打印w [2]行与后一版本.

直接调用该方法,即打印w .__ getitem __(2),在两种情况下都有效…

为什么赋值版本不允许索引?

解决方法:

必须在类上定义特殊方法(基本上每端都有两个下划线).特殊方法的internal lookup procedure完全跳过实例dict.除其他外,如果你这样做,那就是这样

class Foo(object):
    def __repr__(self):
        return 'Foo()'

您定义的__repr__方法仅用于Foo的实例,而不用于repr(Foo).

上一篇:mysql类别树搜索


下一篇:MySQL 5.0索引 – 唯一与非唯一