分配(而不是定义) __getitem__ 魔术方法会破坏索引[重复]

2023-12-19

我有一个类似于此(高度简化)示例的包装类:

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__

但是,我收到了

类型错误:“wrap”对象不支持索引

for the print w[2]与后一个版本一致。

直接调用该方法,即print w.__getitem__(2),在两种情况下都有效...

为什么分配版本不允许索引?


编辑:关于“因重复而关闭”

我同意链接的问题有相同的答案。然而,根本不清楚它们是否是同一个问题。特别是,不知道答案的人也不知道工作中存在总体“问题类型”。因此,不清楚他们是否在一个看似无关的问题中找到了答案__call__.


必须在类上定义特殊方法(基本上是两端各有两个下划线的任何方法)。这内部查找程序 https://docs.python.org/3/reference/datamodel.html#special-lookup对于特殊方法,完全跳过实例字典。除其他事项外,如果您这样做

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分配(而不是定义) __getitem__ 魔术方法会破坏索引[重复] 的相关文章

随机推荐