Вопрос проверяет знание механизма доступа к элементам объекта по индексу и протокола последовательностей.
Для поддержки доступа по индексу нужно реализовать метод __getitem__(self, index). Этот метод вызывается, когда используется синтаксис obj[index]. Он должен возвращать элемент по индексу или выбрасывать IndexError, если индекс выходит за пределы.
Когда в Python используется выражение:
value = obj[2]
Интерпретатор фактически вызывает:
obj.__getitem__(2)
Поэтому достаточно реализовать этот метод, чтобы объект начал поддерживать индексирование.
class MyList:
def __init__(self, data):
self.data = data
def __getitem__(self, index):
return self.data[index]
Теперь:
lst = MyList([10, 20, 30])
print(lst[1]) # 20
Метод __getitem__ может принимать:
целые индексы
срезы (slice)
Пример обработки срезов:
def __getitem__(self, index):
return self.data[index]
Встроенный список уже умеет обрабатывать и индекс, и срез.
Метод __getitem__ является основным механизмом доступа к элементам последовательности. Его реализация делает объект похожим на список или кортеж и позволяет использовать стандартный синтаксис индексирования.