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 respostas

Eu 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?

questionAnswers(2)

yourAnswerToTheQuestion