Магические методы множеств
Множества и их магические методы
После предыдущих уроков, этот уже должен быть простым и понятным. Для создания классов, которые ведут себя как списки или словари тоже есть свой набор методов. Главной возможностью, которая открывается при их реализации становится возможность использовать объект как источник данных для цикла for, функций для работы со множествами и даже использование синтаксиса срезов.
Для того чтобы объект вел себя как множества реализуются свои протоколы. Причем последовательности могут быть как изменяемыми (мутабельными, mutable), так и неизменяемыми (иммутабельными, immutable). И мутабельные реализуют все те же методы, которые реализуют иммутабельные, но плюс к этому реализуют методы __setitem__ and __delitem__.
Если вы хотите реализовать множество, то вот методы, которые вам нужны:
__len__(self)
: Возвращает длину контейнера. Часть протокола для неизменяемых и изменяемых контейнеров.
__getitem__(self, key)
: Определяет поведение при обращении к элементу, используя обозначение self[key]. Это также является частью протоколов и для мутабельных и иммутабельных последовательностй. Метод должен порождать исключения: TypeError, если тип ключа неверен, и KeyError, если для ключа нет соответствующего значения.
__setitem__(self, key, value)
: Определяет поведение, когда элемент присваивается, используя нотацию self[nkey] = value. Это часть протокола мутабельного контейнера. Точно так же необходимо порождать KeyError и TypeError там, где это необходимо.
__delitem__(self, key)
: Определяет поведение при удалении элемента (например, del self[key]). Только для мутабельного контейнера. Правила исключений неправильных ключей сохраняются.
__iter__(self)
: Метод должен возвращать итератор для контейнера. Итераторы возвращаются в различных контекстах, прежде всего встроенной функцией iter() и при переходе по контейнеру с помощью формы for x in container: .... Объект, возвращаемый этим методом, должен иметь свой собственный тип, у которого должен быть реализован метод __iter__, который возвращает объект self.
__reversed__(self)
: Вызывается для реализации поведения встроенной функции reversed(), который обращается к этому магическому методу объекта. Имеет смысл в реализации только если объекты последовательности могут быть упорядочены.
__contains__(self, item)
: Метод используется для проверки на вхождение с помощью in и not in. Особенность метода в том, что если он не реализован, то Python по очереди проходит по каждому элементу и сравнивает элементы. Если найдет совпадение, то возвращает True.
__missing__(self, key)
: реализуется в подклассах типа dict. Служит для проверки наличия ключа в словаре. Например, если для словаря d написать d["nope"], когда ключа "nope" нет, то на самом деле произойдет вызов d.__missing__("nope").