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

userdict.md

116 строк · 18.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/library/userdict.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.12. [`UserDict`](https://python-all.ru/2.7/library/userdict.html#module-UserDict) – Класс-обёртка для словарей89**Исходный код:** [Lib/UserDict.py](https://python-all.ru/src/2.7/Lib/UserDict.py)1011---1213Модуль определяет миксин [`DictMixin`](https://python-all.ru/2.7/library/userdict.html#UserDict.DictMixin), который определяет все методы словаря для классов, уже имеющих минимальный интерфейс отображения. Это значительно упрощает написание классов, которые должны быть взаимозаменяемы со словарями (например, модуль shelve).1415Этот модуль также определяет класс [`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) использовался для создания подклассов, подобных словарю, которые получали новое поведение путём переопределения существующих методов или добавления новых.1617Модуль [`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):1819#### `class UserDict.UserDict([initialdata])`2021Класс, имитирующий словарь. Содержимое экземпляра хранится в обычном словаре, доступном через атрибут `data` экземпляров [`UserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.UserDict). Если указан параметр *initialdata*, то `data` инициализируется его содержимым; обратите внимание, что ссылка на *initialdata* не сохраняется, что позволяет использовать её для других целей.2223> **Примечание**24>25> Для обратной совместимости экземпляры [`UserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.UserDict) не являются итерируемыми.2627#### `class UserDict.IterableUserDict([initialdata])`2829Подкласс [`UserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.UserDict), поддерживающий прямую итерацию (например, `for key in myDict`).3031В дополнение к поддержке методов и операций отображений (см. раздел [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) предоставляют следующий атрибут:3233#### `IterableUserDict.data`3435Реальный словарь, используемый для хранения содержимого класса [`UserDict`](https://python-all.ru/2.7/library/userdict.html#UserDict.UserDict).3637#### `class UserDict.DictMixin`3839Миксин, определяющий все методы словаря для классов, которые уже имеют минимальный интерфейс словаря, включая [`__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()`.4041Этот миксин должен использоваться как суперкласс. Добавление каждого из вышеперечисленных методов добавляет постепенно больше функциональности. Например, определение всех, кроме [`__delitem__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__delitem__), исключит только `pop()` и `popitem()` из полного интерфейса.4243В дополнение к четырём базовым методам, постепенно повышается эффективность при определении [`__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()`.4445Поскольку миксин ничего не знает о конструкторе подкласса, он не определяет [`__init__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__init__) или [`copy()`](https://python-all.ru/2.7/library/copy.html#module-copy).4647Начиная с 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).4849Обратите внимание, что 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).5051# 8.13. [`UserList`](https://python-all.ru/2.7/library/userdict.html#module-UserList) – Класс-обёртка для списков5253> **Примечание**54>55> Когда был выпущен Python 2.2, многие варианты использования этого класса были поглощены возможностью напрямую наследовать от `list`. Однако осталось несколько случаев использования.56>57> Этот модуль предоставляет интерфейс списка вокруг базового хранилища данных. По умолчанию это хранилище данных является `list`; однако его можно использовать для обёртывания интерфейса, подобного списку, вокруг других объектов (таких как постоянное хранилище).58>59> Кроме того, этот класс можно смешивать со встроенными классами с помощью множественного наследования. Это иногда может быть полезно. Например, можно унаследовать от [`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).6061Этот модуль определяет класс, который действует как обёртка для объектов-списков. Это полезный базовый класс для ваших собственных классов, подобных списку, которые могут наследовать от него и переопределять существующие методы или добавлять новые. Таким образом можно добавлять новое поведение к спискам.6263Модуль [`UserList`](https://python-all.ru/2.7/library/userdict.html#module-UserList) определяет класс [`UserList`](https://python-all.ru/2.7/library/userdict.html#UserList.UserList):6465#### `class UserList.UserList([list])`6667Класс, который имитирует список. Содержимое экземпляра хранится в обычном списке, доступном через атрибут [`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).6869> **Примечание**70>71> Класс [`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.7273В дополнение к поддержке методов и операций изменяемых последовательностей (см. раздел [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) предоставляют следующий атрибут:7475#### `UserList.data`7677Реальный объект списка Python, используемый для хранения содержимого класса [`UserList`](https://python-all.ru/2.7/library/userdict.html#UserList.UserList).7879**Требования к подклассам:** Ожидается, что подклассы [`UserList`](https://python-all.ru/2.7/library/userdict.html#UserList.UserList) предоставляют конструктор, который можно вызывать без аргументов или с одним аргументом. Операции со списками, возвращающие новую последовательность, пытаются создать экземпляр фактического класса реализации. Для этого предполагается, что конструктор можно вызвать с одним параметром – объектом-последовательностью, используемым как источник данных.8081Если производный класс не желает соблюдать это требование, все специальные методы, поддерживаемые этим классом, должны быть переопределены; обратитесь к исходному коду за информацией о методах, которые необходимо предоставить в этом случае.8283Изменено в версии 2.0: Версии Python 1.5.2 и 1.6 также требовали, чтобы конструктор можно было вызывать без параметров, и чтобы он предоставлял изменяемый атрибут `data`. Более ранние версии Python не пытались создавать экземпляры производного класса.8485# 8.14. [`UserString`](https://python-all.ru/2.7/library/userdict.html#module-UserString) – Класс-обёртка для строк8687> **Примечание**88>89> Этот класс [`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)).9091Этот модуль определяет класс, который служит обёрткой вокруг строковых объектов. Он является полезным базовым классом для пользовательских строкоподобных классов: они могут наследовать от него и переопределять существующие методы или добавлять новые. Так можно добавлять к строкам новое поведение.9293Следует отметить, что эти классы весьма неэффективны по сравнению с реальными строковыми или Unicode-объектами; особенно это касается [`MutableString`](https://python-all.ru/2.7/library/userdict.html#UserString.MutableString).9495Модуль [`UserString`](https://python-all.ru/2.7/library/userdict.html#module-UserString) определяет следующие классы:9697#### `class UserString.UserString([sequence])`9899Класс, имитирующий строку или 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).100101> **Примечание**102>103> Класс [`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.104105#### `class UserString.MutableString([sequence])`106107Этот класс наследуется от описанного выше [`UserString`](https://python-all.ru/2.7/library/userdict.html#UserString.UserString) и переопределяет строки, делая их *изменяемыми*. Изменяемые строки не могут использоваться в качестве ключей словаря, поскольку словари требуют *неизменяемых* объектов в качестве ключей. Основное назначение этого класса – служить учебным примером наследования и необходимости удалять (переопределять) метод [`__hash__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__hash__), чтобы перехватывать попытки использовать изменяемый объект как ключ словаря – иначе такие ошибки были бы очень вероятны и их было бы трудно отследить.108109Устарело с версии 2.6: Класс [`MutableString`](https://python-all.ru/2.7/library/userdict.html#UserString.MutableString) удалён в Python 3.110111В дополнение к поддержке методов и операций строк и Unicode-объектов (см. раздел [Строковые методы](https://python-all.ru/2.7/library/stdtypes.html#string-methods)), экземпляры [`UserString`](https://python-all.ru/2.7/library/userdict.html#UserString.UserString) предоставляют следующий атрибут:112113#### `MutableString.data`114115Реальная строка Python или Unicode-объект, используемый для хранения содержимого класса [`UserString`](https://python-all.ru/2.7/library/userdict.html#UserString.UserString).116