Atribuir (em vez de definir) um método mágico __getitem__ interrompe a indexação [duplicado]
Esta pergunta já tem uma resposta aqui:
Por que não adicionar dinamicamente um método `__call__` a uma instância funciona? 2 respostasEu tenho uma classe de wrapper semelhante a este exemplo (fortemente simplificado):
class wrap(object):
def __init__(self):
self._data = range(10)
def __getitem__(self, key):
return self._data.__getitem__(key)
Eu posso usá-lo assim:
w = wrap()
print w[2] # yields "2"
Eu pensei que poderia otimizar e me livrar de uma chamada de função, alterando para isso:
class wrap(object):
def __init__(self):
self._data = range(10)
self.__getitem__ = self._data.__getitem__
No entanto, recebo uma
TypeError: o objeto 'wrap' não suporta indexação
para oprint w[2]
de acordo com a última versão.
A chamada direta para o método, ou seja,print w.__getitem__(2)
, funciona nos dois casos ...
Por que a versão da atribuição não permite a indexação?