Колекції в 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 |