当前位置 : 主页 > 编程语言 > python >

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

来源:互联网 收集:自由互联 发布时间:2021-06-25
参见英文答案 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__(sel
参见英文答案 > 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).

网友评论