参见英文答案 > 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).