> **Источник:** https://python-all.ru/2.7/library/userdict.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 8.12. [`UserDict`](https://python-all.ru/2.7/library/userdict.html#module-UserDict) – Класс-обёртка для словарей

**Исходный код:** [Lib/UserDict.py](https://python-all.ru/src/2.7/Lib/UserDict.py)

---

Модуль определяет миксин [`DictMixin`](https://python-all.ru/2.7/library/userdict.html#UserDict.DictMixin), который определяет все методы словаря для классов, уже имеющих минимальный интерфейс отображения. Это значительно упрощает написание классов, которые должны быть взаимозаменяемы со словарями (например, модуль shelve).

Этот модуль также определяет класс [`UserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.UserDict), который действует как обёртка для объектов словаря. Необходимость в этом классе была в значительной степени вытеснена возможностью напрямую наследовать от [`dict`](https://python-all.ru/2.7/library/stdtypes.html#dict) (функция, появившаяся начиная с Python версии 2.2). До введения [`dict`](https://python-all.ru/2.7/library/stdtypes.html#dict) класс [`UserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.UserDict) использовался для создания подклассов, подобных словарю, которые получали новое поведение путём переопределения существующих методов или добавления новых.

Модуль [`UserDict`](https://python-all.ru/2.7/library/userdict.html#module-UserDict) определяет класс [`UserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.UserDict) и [`DictMixin`](https://python-all.ru/2.7/library/userdict.html#UserDict.DictMixin):

#### `class UserDict.UserDict([initialdata])`

Класс, имитирующий словарь. Содержимое экземпляра хранится в обычном словаре, доступном через атрибут `data` экземпляров [`UserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.UserDict). Если указан параметр *initialdata*, то `data` инициализируется его содержимым; обратите внимание, что ссылка на *initialdata* не сохраняется, что позволяет использовать её для других целей.

> **Примечание**
>
> Для обратной совместимости экземпляры [`UserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.UserDict) не являются итерируемыми.

#### `class UserDict.IterableUserDict([initialdata])`

Подкласс [`UserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.UserDict), поддерживающий прямую итерацию (например, `for key in myDict`).

В дополнение к поддержке методов и операций отображений (см. раздел [Mapping Types – dict](https://python-all.ru/2.7/library/stdtypes.html#typesmapping)), экземпляры [`UserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.UserDict) и [`IterableUserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.IterableUserDict) предоставляют следующий атрибут:

#### `IterableUserDict.data`

Реальный словарь, используемый для хранения содержимого класса [`UserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.UserDict).

#### `class UserDict.DictMixin`

Миксин, определяющий все методы словаря для классов, которые уже имеют минимальный интерфейс словаря, включая [`__getitem__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__getitem__), [`__setitem__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__setitem__), [`__delitem__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__delitem__) и `keys()`.

Этот миксин должен использоваться как суперкласс. Добавление каждого из вышеперечисленных методов добавляет постепенно больше функциональности. Например, определение всех, кроме [`__delitem__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__delitem__), исключит только `pop()` и `popitem()` из полного интерфейса.

В дополнение к четырём базовым методам, постепенно повышается эффективность при определении [`__contains__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__contains__), [`__iter__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__iter__) и `iteritems()`.

Поскольку миксин ничего не знает о конструкторе подкласса, он не определяет [`__init__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__init__) или [`copy()`](https://python-all.ru/2.7/library/copy.html#module-copy).

Начиная с Python версии 2.6, рекомендуется использовать [`collections.MutableMapping`](https://python-all.ru/2.7/library/collections.html#collections.MutableMapping) вместо [`DictMixin`](https://python-all.ru/2.7/library/userdict.html#UserDict.DictMixin).

Обратите внимание, что DictMixin не реализует методы [`viewkeys()`](https://python-all.ru/2.7/library/stdtypes.html#dict.viewkeys), [`viewvalues()`](https://python-all.ru/2.7/library/stdtypes.html#dict.viewvalues) или [`viewitems()`](https://python-all.ru/2.7/library/stdtypes.html#dict.viewitems).

# 8.13. [`UserList`](https://python-all.ru/2.7/library/userdict.html#module-UserList) – Класс-обёртка для списков

> **Примечание**
>
> Когда был выпущен Python 2.2, многие варианты использования этого класса были поглощены возможностью напрямую наследовать от `list`. Однако осталось несколько случаев использования.
>
> Этот модуль предоставляет интерфейс списка вокруг базового хранилища данных. По умолчанию это хранилище данных является `list`; однако его можно использовать для обёртывания интерфейса, подобного списку, вокруг других объектов (таких как постоянное хранилище).
>
> Кроме того, этот класс можно смешивать со встроенными классами с помощью множественного наследования. Это иногда может быть полезно. Например, можно унаследовать от [`UserList`](https://python-all.ru/2.7/library/userdict.html#UserList.UserList) и [`str`](https://python-all.ru/2.7/library/functions.html#str) одновременно. Это было бы невозможно одновременно с реальным `list` и реальным [`str`](https://python-all.ru/2.7/library/functions.html#str).

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

Модуль [`UserList`](https://python-all.ru/2.7/library/userdict.html#module-UserList) определяет класс [`UserList`](https://python-all.ru/2.7/library/userdict.html#UserList.UserList):

#### `class UserList.UserList([list])`

Класс, который имитирует список. Содержимое экземпляра хранится в обычном списке, доступном через атрибут [`data`](https://python-all.ru/2.7/library/userdict.html#UserList.UserList.data) экземпляров [`UserList`](https://python-all.ru/2.7/library/userdict.html#UserList.UserList). Содержимое экземпляра изначально устанавливается как копия *list*, по умолчанию пустой список `[]`. *list* может быть любой итерабельной последовательностью, например, реальным списком Python или объектом [`UserList`](https://python-all.ru/2.7/library/userdict.html#UserList.UserList).

> **Примечание**
>
> Класс [`UserList`](https://python-all.ru/2.7/library/userdict.html#UserList.UserList) был перемещён в модуль [`collections`](https://python-all.ru/2.7/library/collections.html#module-collections) в Python 3. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) будет автоматически адаптировать импорты при преобразовании ваших исходников в Python 3.

В дополнение к поддержке методов и операций изменяемых последовательностей (см. раздел [Sequence Types – str, unicode, list, tuple, bytearray, buffer, xrange](https://python-all.ru/2.7/library/stdtypes.html#typesseq)), экземпляры [`UserList`](https://python-all.ru/2.7/library/userdict.html#UserList.UserList) предоставляют следующий атрибут:

#### `UserList.data`

Реальный объект списка Python, используемый для хранения содержимого класса [`UserList`](https://python-all.ru/2.7/library/userdict.html#UserList.UserList).

**Требования к подклассам:** Ожидается, что подклассы [`UserList`](https://python-all.ru/2.7/library/userdict.html#UserList.UserList) предоставляют конструктор, который можно вызывать без аргументов или с одним аргументом. Операции со списками, возвращающие новую последовательность, пытаются создать экземпляр фактического класса реализации. Для этого предполагается, что конструктор можно вызвать с одним параметром – объектом-последовательностью, используемым как источник данных.

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

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

# 8.14. [`UserString`](https://python-all.ru/2.7/library/userdict.html#module-UserString) – Класс-обёртка для строк

> **Примечание**
>
> Этот класс [`UserString`](https://python-all.ru/2.7/library/userdict.html#UserString.UserString) из этого модуля доступен только для обратной совместимости. Если вы пишете код, который не должен работать с версиями Python старше Python 2.2, рассмотрите возможность наследования напрямую от встроенного типа [`str`](https://python-all.ru/2.7/library/functions.html#str) вместо использования [`UserString`](https://python-all.ru/2.7/library/userdict.html#UserString.UserString) (нет встроенного эквивалента для [`MutableString`](https://python-all.ru/2.7/library/userdict.html#UserString.MutableString)).

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

Следует отметить, что эти классы весьма неэффективны по сравнению с реальными строковыми или Unicode-объектами; особенно это касается [`MutableString`](https://python-all.ru/2.7/library/userdict.html#UserString.MutableString).

Модуль [`UserString`](https://python-all.ru/2.7/library/userdict.html#module-UserString) определяет следующие классы:

#### `class UserString.UserString([sequence])`

Класс, имитирующий строку или Unicode-строку. Содержимое экземпляра хранится в обычной строке или Unicode-строке, доступной через атрибут `data` экземпляров [`UserString`](https://python-all.ru/2.7/library/userdict.html#UserString.UserString). Содержимое экземпляра изначально устанавливается в копию *последовательности*. *Последовательность* может быть либо обычной строкой Python или Unicode-строкой, экземпляром [`UserString`](https://python-all.ru/2.7/library/userdict.html#UserString.UserString) (или подкласса), либо произвольной последовательностью, которую можно преобразовать в строку с помощью встроенной функции [`str()`](https://python-all.ru/2.7/library/functions.html#str).

> **Примечание**
>
> Класс [`UserString`](https://python-all.ru/2.7/library/userdict.html#UserString.UserString) был перемещён в модуль [`collections`](https://python-all.ru/2.7/library/collections.html#module-collections) в Python 3. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) автоматически адаптирует импорты при преобразовании исходных кодов в Python 3.

#### `class UserString.MutableString([sequence])`

Этот класс наследуется от описанного выше [`UserString`](https://python-all.ru/2.7/library/userdict.html#UserString.UserString) и переопределяет строки, делая их *изменяемыми*. Изменяемые строки не могут использоваться в качестве ключей словаря, поскольку словари требуют *неизменяемых* объектов в качестве ключей. Основное назначение этого класса – служить учебным примером наследования и необходимости удалять (переопределять) метод [`__hash__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__hash__), чтобы перехватывать попытки использовать изменяемый объект как ключ словаря – иначе такие ошибки были бы очень вероятны и их было бы трудно отследить.

Устарело с версии 2.6: Класс [`MutableString`](https://python-all.ru/2.7/library/userdict.html#UserString.MutableString) удалён в Python 3.

В дополнение к поддержке методов и операций строк и Unicode-объектов (см. раздел [Строковые методы](https://python-all.ru/2.7/library/stdtypes.html#string-methods)), экземпляры [`UserString`](https://python-all.ru/2.7/library/userdict.html#UserString.UserString) предоставляют следующий атрибут:

#### `MutableString.data`

Реальная строка Python или Unicode-объект, используемый для хранения содержимого класса [`UserString`](https://python-all.ru/2.7/library/userdict.html#UserString.UserString).
