Как переопределить оператор [] в Python?

225

Как называется метод переопределения []оператора (индексная запись) для класса в Python?

Sahas
источник

Ответы:

290

Вам нужно использовать __getitem__метод .

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

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

И если вы собираетесь устанавливать значения, вам также необходимо реализовать __setitem__метод , иначе это произойдет:

>>> myobj[5] = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: MyClass instance has no attribute '__setitem__'
Дэйв Уэбб
источник
63

Чтобы полностью перегружать его также необходимо реализовать __setitem__и __delitem__методы.

редактировать

Я чуть не забыл ... если ты хочешь полностью эмулировать список, тебе тоже нужно __getslice__, __setslice__ and __delslice__.

Все они документированы в http://docs.python.org/reference/datamodel.html.

Дейв Кирби
источник
67
__getslice__, __setslice__` и __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__` и __delitem__' and test if the argument is of type нарезать, , i.e.: если есть экземпляр (arg, slice): ...
Дон О'Доннелл