
__getitem__()— это специальный метод в Python, который определяет поведение при доступе к элементам объекта через индекс или ключ. Этот метод часто используется в пользовательских коллекциях и других классах, которые представляют некую форму контейнера.
Синтаксис для __getitem__() включает индекс или ключ, который используется для доступа к элементам. Метод __getitem__() должен возвращать элемент, соответствующий данному индексу или ключу, или генерировать исключение IndexError или KeyError, если такого элемента нет.
class MyCollection:
    def __init__(self, data):
        self.data = data
    def __getitem__(self, index):
        return self.data[index]
obj = MyCollection([1, 2, 3, 4, 5])
print(obj[1])  # Выводит: 2В этом примере __getitem__() просто возвращает элемент из списка data по указанному индексу.
__getitem__() является основным способом реализации поведения индексации и среза в Python. Он также используется для поддержки итераций по объектам.
__getitem__() может также принимать срезы, что позволяет реализовать более сложное поведение индексации.
class MyCollection:
    def __init__(self, data):
        self.data = data
    def __getitem__(self, index):
        if isinstance(index, slice):
            return self.data[index.start:index.stop:index.step]
        else:
            return self.data[index]
obj = MyCollection([1, 2, 3, 4, 5])
print(obj[1:3])  # Выводит: [2, 3]В этом примере __getitem__() возвращает срез списка data, если индекс является объектом slice.
Если класс реализует __getitem__(), он автоматически становится итерируемым, и его объекты могут использоваться в циклах for и других контекстах, которые требуют итератора.
class MyCollection:
    def __init__(self, data):
        self.data = data
    def __getitem__(self, index):
        return self.data[index]
obj = MyCollection([1, 2, 3, 4, 5])
for i in obj:
    print(i)  # Выводит: 1, 2, 3, 4, 5Хотя примеры выше использовали числовые индексы, __getitem__() может принимать любой тип ключа. Это делает его полезным для реализации пользовательских словарей и других коллекций, которые используют нечисловые ключи.
class MyDict:
    def __init__(self, data):
        self.data = data
    def __getitem__(self, key):
        return self.data[key]
obj = MyDict({'a': 1, 'b': 2, 'c': 3})
print(obj['a'])  # Выводит: 1__getitem__() с __len__(): Чтобы объект полностью поддерживал протокол контейнера Python, он также должен реализовывать __len__(), возвращающий количество элементов в контейнере.__getitem__() вызывается с индексом или ключом, которые не существуют в контейнере. Обычно в таких случаях следует генерировать IndexError или KeyError.__getitem__() для многомерных контейнеров: Метод __getitem__() может быть использован для создания многомерных массивов или матриц, где индексом является кортеж.class Matrix:
    def __init__(self, data):
        self.data = data
    def __getitem__(self, index):
        row, col = index
        return self.data[row][col]
m = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(m[1, 2])  # Выводит: 6В этом примере класс Matrix поддерживает двумерную индексацию с использованием кортежей в качестве индексов.
Несмотря на мощь и гибкость __getitem__(), его следует использовать с осторожностью. Переопределение базового поведения доступа к элементам может сделать ваш код сложнее для понимания и поддержки, особенно для других разработчиков. Всегда убедитесь, что преимущества от использования __getitem__() перевешивают потенциальные сложности.
__getitem__() — это мощный и гибкий специальный метод Python, который позволяет определить поведение индексации, среза и итерации в ваших классах. В то время как встроенные коллекции Python часто обеспечивают все, что вам нужно, __getitem__() позволяет вам углубиться и создать свои собственные коллекции со специализированным поведением.
Содержание: