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