Перейти до змісту

Колекції в Python

В Python існує багато способів заставити ваші класи поводитись як вбудовані контейнери (словники, кортежі, списки, рядки інше). Для цього клас має реалізувати відповідний протокол.

Протокол (в контексті) — набір методів, який має реалізовувати клас щоб відповідати певним сутностям.

Реалізація довільних контейнерних типів в Python призводить до використання деяких з них. Наприклад, протокол для визначення незмінних контейнерів: щоб створити нлезмінний контейнер, має бути визначено __len__ і __getitem__. Протокол змінного контейнера потребує того ж, плюс __setitem__ і __delitem__. І, якщо ви бажаєте, щоб ваші об'єкти можна було перебирати ітераціями, ви маєте визначити __iter__, який повертає ітератор.

Ось магічні методи, які використовують контейнери:

__getitem__(self, key)

Визначає поведінку при доступі до елемента використовуючи наступний синтаксис:

self[key]`

Стосується протоколу змінних і протоколу незмінних контейнерів.

Для послідовностей key має бути цілим або зрізанням. При цьому в методі може бути реалізована інтерпретація від'ємних індексів.

Метод має піднімати відповідний виняток:

  • TypeError — коли тип ключа не підтримується.
  • KeyError — коли ключу не відповідає жодне значення у відображеннях.
  • IndexError — якщо ключ виходить за межі ключей послідовності (у тому числі після інтерпретації від'ємних значень).

Цикл for in для правильного визначення кінця послідовності очікує, що для недопустимих індексів піднімається виняток IndexError.

__len__(self)

Повертає кількість елементів у контейнері. Частина протоколів для змінного та незмінного контейнерів.

__setitem__(self, key, value)

Визначає поведінку при присвоєнні значення елементу при використанні синтаксису:

self[key] = value

Частина протокола змінного контейнера. Має піднімати KeyError і TypeError у відповідних випадках.

__delitem__(self, key)

Визначає поведінку при видаленні елемента. Частина протокола для змінних контейнерів. Має піднімати відповідний виняток, якщо ключ некоректний.

__iter__(self)

Повертає ітератор для контейнера.

__reversed__(self)

Визначає поведінку для вбудованої функції reversed(). Має повернути "зворотню" версію послідовності. Реалізується для впорядкованих контейнерів.

__contains__(self, item)

Реалізує перевірку належності елемента при використанні синтаксиса:

in/not in

Метод не є частиною протокола послідовності, оскільки Python може самостійно виконувати пошук елемента "перебираючи" всю послідовність.

Collections and their exceptions:

List Set Dict
getitem() IndexError KeyError
pop() IndexError KeyError KeyError
remove() ValueError KeyError
index() ValueError
Back to top