Эмулирование типов контейнеров

Для реализации объектов-контейнеров могут быть определены следующие методы. Контейнеры обычно представляют собой последовательности (такие как списки или кортежи) или мапирования (например, словари), но могут также представлять и другие контейнеры.

Первый набор методов используется либо для эмуляции (имитирования) последовательности, либо для эмуляции мапирования. Разница в том, что для последовательности, допустимые ключи должны быть целыми числами k, для которых 0 <= k <N, где N – длина последовательности. Также рекомендуется, чтобы мапирования предоставляли методы keys () , values ​​() , items () , has_key () , get () , clear () , setdefault () , iterkeys () , itervalues ​​() , iteritems () () , popitem () , copy () и update (), которые ведут себя по аналогии со стандартными объектами словаря Python.

Модуль UserDict предоставляет класс DictMixin для того, чтобы помочь создать эти методы из базового набора __getitem __ () , __setitem __ () , __delitem __ () и keys () . Переменные последовательности должны предоставлять методы append () , count () , index () , extend () , insert () , pop () , remove () , reverse () и sort () , как стандартные объекты списка Python. Наконец, типы последовательностей должны реализовывать сложение (то есть конкатенацию) и умножение (то есть повторение), определяя методы __add __ () , __radd __ () , __iadd __ () , __mul __ () , __rmul __ () и __imul __ (), описанные ниже. Они не должны определять __coerce __ () или другие числовые операторы.

Рекомендуется, чтобы как мапирование, так и последовательности реализовывали метод __contains __ () для обеспечения эффективного использования оператора in. Что касается мапирования, in должно быть эквивалентно has_key (), а для последовательностей, он должен искать значения. Кроме того, рекомендуется, чтобы оба (мапирование и последовательности) реализовывали метод __iter __ () , чтобы обеспечить эффективную итерацию через контейнер. Для мапирований, __iter __ () должен быть таким же, как iterkeys (). Для последовательностей, он должен перебирать значения. __len __ (self) Используется для реализации встроенной функции len (). Возвращает длину объекта, целое число> = 0. Кроме того, объект, который не определяет метод __nonzero __ () и чей метод __len __ () возвращает ноль, считается ложным в булевском контексте.

__getitem __ (self, key)
Вызывается для определения self [key] . Для типов последовательности, принятые ключи должны быть целыми числами и объектами-срезами. Обратите внимание, что специальная интерпретация отрицательных индексов (если класс хочет эмулировать тип последовательности ) зависит от метода __getitem __ () .
Если ключ имеет неподходящий тип, может выйти TypeError. Если значение вне набора индексов для последовательности (после любой специальной интерпретации отрицательных значений), получится IndexError.
Для типов мапирования, если ключ отсутствует (не в контейнере), выйдет KeyError. Примечание : для циклов, ожидайте, что выйдет IndexError для нелегальных индексов, чтобы обеспечить надлежащее обнаружение конца последовательности.

__setitem __ (self, key, value)
Используется для реализации присвоения self [key] . Должно применяться только для мапирования, если объекты поддерживают изменения значений для ключей, или если новые ключи могут быть добавлены, или для последовательностей, если элементы могут быть заменены. Для недопустимых значений ключа, как и для метода __getitem __ (), должны быть созданы те же исключения.

__delitem __ (self, key)
Вызывается для осуществления удаления self [key] . Должен быть использован для мапирования только в том случае, если объекты поддерживают удаление ключей, или для последовательностей, если элементы могут быть удалены из последовательности. Для недопустимых значений ключа, как и для метода __getitem __ (), должны быть созданы те же исключения.

__iter __ (self)
Этот метод вызывается, когда для контейнера требуется итератор. Этот метод должен возвращать новый объект итератора, который может выполнять итерацию по всем объектам в контейнере. Для сопоставлений он должен перебирать ключи контейнера, а также должен быть доступен как метод iterkeys () .

__contains __ (self, item)
Используется для реализации операторов проверки членства. Должно возвращать True, если элемент находится в автономном режиме, иначе False . Для объектов мапирования, учитывает ключи мапирования, а не значения или пары ключевых элементов.

Все статьи по теме:

Поделитесь с друзьями:

Оставьте комментарий