Документация Python неофициальный перевод

8.12. UserDict – Класс-обёртка для словарейUserDict – Class wrapper for dictionary objects

Исходный код: Lib/UserDict.py


Модуль определяет миксин DictMixin, который определяет все методы словаря для классов, уже имеющих минимальный интерфейс отображения. Это значительно упрощает написание классов, которые должны быть взаимозаменяемы со словарями (например, модуль shelve).

Этот модуль также определяет класс UserDict, который действует как обёртка для объектов словаря. Необходимость в этом классе была в значительной степени вытеснена возможностью напрямую наследовать от dict (функция, появившаяся начиная с Python версии 2.2). До введения dict класс UserDict использовался для создания подклассов, подобных словарю, которые получали новое поведение путём переопределения существующих методов или добавления новых.

Модуль UserDict определяет класс UserDict и DictMixin:

class UserDict.UserDict([initialdata])

Класс, имитирующий словарь. Содержимое экземпляра хранится в обычном словаре, доступном через атрибут data экземпляров UserDict. Если указан параметр initialdata, то data инициализируется его содержимым; обратите внимание, что ссылка на initialdata не сохраняется, что позволяет использовать её для других целей.

Примечание

Для обратной совместимости экземпляры UserDict не являются итерируемыми.

class UserDict.IterableUserDict([initialdata])

Подкласс UserDict, поддерживающий прямую итерацию (например, for key in myDict).

В дополнение к поддержке методов и операций отображений (см. раздел Mapping Types – dict), экземпляры UserDict и IterableUserDict предоставляют следующий атрибут:

IterableUserDict.data

Реальный словарь, используемый для хранения содержимого класса UserDict.

class UserDict.DictMixin

Миксин, определяющий все методы словаря для классов, которые уже имеют минимальный интерфейс словаря, включая __getitem__(), __setitem__(), __delitem__() и keys().

Этот миксин должен использоваться как суперкласс. Добавление каждого из вышеперечисленных методов добавляет постепенно больше функциональности. Например, определение всех, кроме __delitem__(), исключит только pop() и popitem() из полного интерфейса.

В дополнение к четырём базовым методам, постепенно повышается эффективность при определении __contains__(), __iter__() и iteritems().

Поскольку миксин ничего не знает о конструкторе подкласса, он не определяет __init__() или copy().

Начиная с Python версии 2.6, рекомендуется использовать collections.MutableMapping вместо DictMixin.

Обратите внимание, что DictMixin не реализует методы viewkeys(), viewvalues() или viewitems().

8.13. UserList – Класс-обёртка для списковUserList – Class wrapper for list objects

Примечание

Когда был выпущен Python 2.2, многие варианты использования этого класса были поглощены возможностью напрямую наследовать от list. Однако осталось несколько случаев использования.

Этот модуль предоставляет интерфейс списка вокруг базового хранилища данных. По умолчанию это хранилище данных является list; однако его можно использовать для обёртывания интерфейса, подобного списку, вокруг других объектов (таких как постоянное хранилище).

Кроме того, этот класс можно смешивать со встроенными классами с помощью множественного наследования. Это иногда может быть полезно. Например, можно унаследовать от UserList и str одновременно. Это было бы невозможно одновременно с реальным list и реальным str.

Этот модуль определяет класс, который действует как обёртка для объектов-списков. Это полезный базовый класс для ваших собственных классов, подобных списку, которые могут наследовать от него и переопределять существующие методы или добавлять новые. Таким образом можно добавлять новое поведение к спискам.

Модуль UserList определяет класс UserList:

class UserList.UserList([list])

Класс, который имитирует список. Содержимое экземпляра хранится в обычном списке, доступном через атрибут data экземпляров UserList. Содержимое экземпляра изначально устанавливается как копия list, по умолчанию пустой список []. list может быть любой итерабельной последовательностью, например, реальным списком Python или объектом UserList.

Примечание

Класс UserList был перемещён в модуль collections в Python 3. Инструмент 2to3 будет автоматически адаптировать импорты при преобразовании ваших исходников в Python 3.

В дополнение к поддержке методов и операций изменяемых последовательностей (см. раздел Sequence Types – str, unicode, list, tuple, bytearray, buffer, xrange), экземпляры UserList предоставляют следующий атрибут:

UserList.data

Реальный объект списка Python, используемый для хранения содержимого класса UserList.

Требования к подклассам: Ожидается, что подклассы UserList предоставляют конструктор, который можно вызывать без аргументов или с одним аргументом. Операции со списками, возвращающие новую последовательность, пытаются создать экземпляр фактического класса реализации. Для этого предполагается, что конструктор можно вызвать с одним параметром – объектом-последовательностью, используемым как источник данных.

Если производный класс не желает соблюдать это требование, все специальные методы, поддерживаемые этим классом, должны быть переопределены; обратитесь к исходному коду за информацией о методах, которые необходимо предоставить в этом случае.

Изменено в версии 2.0: Версии Python 1.5.2 и 1.6 также требовали, чтобы конструктор можно было вызывать без параметров, и чтобы он предоставлял изменяемый атрибут data. Более ранние версии Python не пытались создавать экземпляры производного класса.

8.14. UserString – Класс-обёртка для строкUserString – Class wrapper for string objects

Примечание

Этот класс UserString из этого модуля доступен только для обратной совместимости. Если вы пишете код, который не должен работать с версиями Python старше Python 2.2, рассмотрите возможность наследования напрямую от встроенного типа str вместо использования UserString (нет встроенного эквивалента для MutableString).

Этот модуль определяет класс, который служит обёрткой вокруг строковых объектов. Он является полезным базовым классом для пользовательских строкоподобных классов: они могут наследовать от него и переопределять существующие методы или добавлять новые. Так можно добавлять к строкам новое поведение.

Следует отметить, что эти классы весьма неэффективны по сравнению с реальными строковыми или Unicode-объектами; особенно это касается MutableString.

Модуль UserString определяет следующие классы:

class UserString.UserString([sequence])

Класс, имитирующий строку или Unicode-строку. Содержимое экземпляра хранится в обычной строке или Unicode-строке, доступной через атрибут data экземпляров UserString. Содержимое экземпляра изначально устанавливается в копию последовательности. Последовательность может быть либо обычной строкой Python или Unicode-строкой, экземпляром UserString (или подкласса), либо произвольной последовательностью, которую можно преобразовать в строку с помощью встроенной функции str().

Примечание

Класс UserString был перемещён в модуль collections в Python 3. Инструмент 2to3 автоматически адаптирует импорты при преобразовании исходных кодов в Python 3.

class UserString.MutableString([sequence])

Этот класс наследуется от описанного выше UserString и переопределяет строки, делая их изменяемыми. Изменяемые строки не могут использоваться в качестве ключей словаря, поскольку словари требуют неизменяемых объектов в качестве ключей. Основное назначение этого класса – служить учебным примером наследования и необходимости удалять (переопределять) метод __hash__(), чтобы перехватывать попытки использовать изменяемый объект как ключ словаря – иначе такие ошибки были бы очень вероятны и их было бы трудно отследить.

Устарело с версии 2.6: Класс MutableString удалён в Python 3.

В дополнение к поддержке методов и операций строк и Unicode-объектов (см. раздел Строковые методы), экземпляры UserString предоставляют следующий атрибут:

MutableString.data

Реальная строка Python или Unicode-объект, используемый для хранения содержимого класса UserString.