参见英文答案 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
我有一个类似于这个(强烈简化)示例的包装类:
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).