Como substituir o operador [] no Python?

225

Qual é o nome do método para substituir o []operador (notação subscrita) de uma classe em Python?

Sahas
fonte

Respostas:

290

Você precisa usar o __getitem__método .

class MyClass:
    def __getitem__(self, key):
        return key * 2

myobj = MyClass()
myobj[3] #Output: 6

E se você definir valores, também precisará implementar o __setitem__método , caso contrário, isso acontecerá:

>>> myobj[5] = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: MyClass instance has no attribute '__setitem__'
Dave Webb
fonte
63

Para sobrecarregá-lo completamente, você também precisa implementar os métodos __setitem__e __delitem__.

editar

Eu quase esqueci ... se você quiser emular completamente uma lista, também precisa __getslice__, __setslice__ and __delslice__.

Todos estão documentados em http://docs.python.org/reference/datamodel.html

Dave Kirby
fonte
67
__getslice__, __setslice__` e __delslice__' have been deprecated for the last few releases of ver 2.x (not sure exactly when), and are no longer supported in ver 3.x. Instead, use __getitem__ . __setitem__` e __delitem__' and test if the argument is of type fatia , i.e.: se isinstance (arg, fatia): ...
Don O'Donnell