我有一个类似于此(高度简化)示例的包装类:
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(使用前将#替换为@)