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

types.md

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

1> **Источник:** https://python-all.ru/3.4/library/types.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.9. [`types`](https://python-all.ru/3.4/library/types.html#module-types) – Динамическое создание типов и имена для встроенных типов89**Исходный код:** [Lib/types.py](https://python-all.ru/src/3.4/Lib/types.py)1011---1213Этот модуль определяет вспомогательную функцию для динамического создания новых типов.1415Он также определяет имена для некоторых типов объектов, которые используются стандартным интерпретатором Python, но не представлены как встроенные, такие как [`int`](https://python-all.ru/3.4/library/functions.html#int) или [`str`](https://python-all.ru/3.4/library/stdtypes.html#str).1617Наконец, он предоставляет несколько дополнительных вспомогательных классов и функций, связанных с типами, которые не настолько фундаментальны, чтобы быть встроенными.1819## 8.9.1. Создание динамических типов2021#### `types.new_class(name, bases=(), kwds=None, exec_body=None)`2223Динамически создаёт объект класса, используя соответствующий метакласс.2425Первые три аргумента – это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку), именованные аргументы (например, `metaclass`).2627Аргумент *exec\_body* – это колбэк, который используется для заполнения вновь созданного пространства имён класса. Он должен принимать пространство имён класса в качестве единственного аргумента и обновлять пространство имён непосредственно содержимым класса. Если колбэк не указан, эффект аналогичен передаче `lambda ns: ns`.2829Новое в версии 3.3.3031#### `types.prepare_class(name, bases=(), kwds=None)`3233Вычисляет соответствующий метакласс и создаёт пространство имён класса.3435Аргументы – это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку) и именованные аргументы (например, `metaclass`).3637Возвращаемое значение – кортеж из трёх элементов: `metaclass, namespace, kwds`3839*metaclass* – это подходящий метакласс, *namespace* – это подготовленное пространство имён класса, а *kwds* – это обновлённая копия переданного аргумента *kwds*, из которой удалена запись `'metaclass'`. Если аргумент *kwds* не передан, это будет пустой словарь.4041Новое в версии 3.3.4243> **См. также**44>45> **[*Настройка создания классов*](https://python-all.ru/3.4/reference/datamodel.html#metaclasses)**46>47> Полные сведения о процессе создания класса, поддерживаемом этими функциями48>49> **[**PEP 3115**](https://python-all.ru/3.4/library/types.html) – Метаклассы в Python 3000**50>51> Представлен хук пространства имён52>53> `__prepare__`5455## 8.9.2. Стандартные типы интерпретатора5657Этот модуль предоставляет имена для многих типов, необходимых для реализации интерпретатора Python. Он намеренно избегает включения некоторых типов, которые возникают только попутно в процессе обработки, например типа `listiterator`.5859Обычно эти имена используют для проверок с помощью [`isinstance()`](https://python-all.ru/3.4/library/functions.html#isinstance) или [`issubclass()`](https://python-all.ru/3.4/library/functions.html#issubclass).6061Стандартные имена определены для следующих типов:6263#### `types.FunctionType`6465#### `types.LambdaType`6667Тип пользовательских функций и функций, созданных с помощью выражений [`lambda`](https://python-all.ru/3.4/reference/expressions.html#lambda).6869#### `types.GeneratorType`7071Тип объектов-итераторов [*generator*](https://python-all.ru/3.4/glossary.html#term-generator), создаваемых вызовом генераторной функции.7273#### `types.CodeType`7475Тип объектов кода, таких как возвращаемые [`compile()`](https://python-all.ru/3.4/library/functions.html#compile).7677#### `types.MethodType`7879Тип методов экземпляров пользовательских классов.8081#### `types.BuiltinFunctionType`8283#### `types.BuiltinMethodType`8485Тип встроенных функций, таких как [`len()`](https://python-all.ru/3.4/library/functions.html#len) или [`sys.exit()`](https://python-all.ru/3.4/library/sys.html#sys.exit), и методов встроенных классов. (Здесь термин «встроенный» означает «написанный на C».)8687#### `class types.ModuleType(name, doc=None)`8889Тип [*модулей*](https://python-all.ru/3.4/glossary.html#term-module). Конструктор принимает имя создаваемого модуля и, опционально, его [*докстринг*](https://python-all.ru/3.4/glossary.html#term-docstring).9091#### `__doc__`9293[*Докстрока*](https://python-all.ru/3.4/glossary.html#term-docstring) модуля. По умолчанию `None`.9495#### `__loader__`9697[*Загрузчик*](https://python-all.ru/3.4/glossary.html#term-loader), который загрузил модуль. По умолчанию `None`.9899Изменено в версии 3.4: По умолчанию `None`. Ранее атрибут был необязательным.100101#### `__name__`102103Имя модуля.104105#### `__package__`106107К какому [*пакету*](https://python-all.ru/3.4/glossary.html#term-package) относится модуль. Если модуль является корневым (т.е. не входит ни в один конкретный пакет), то атрибут должен быть установлен в `''`, иначе в имя пакета (которым может быть [`__name__`](https://python-all.ru/3.4/reference/import.html#__name__), если сам модуль является пакетом). По умолчанию `None`.108109Изменено в версии 3.4: По умолчанию теперь `None`. Ранее атрибут был необязательным.110111#### `types.TracebackType`112113Тип объектов traceback, таких как `sys.exc_info()[2]`.114115#### `types.FrameType`116117Тип объектов фреймов, таких как `tb.tb_frame`, если `tb` является объектом traceback.118119#### `types.GetSetDescriptorType`120121Тип объектов, определённых в расширениях модулей с помощью `PyGetSetDef`, таких как `FrameType.f_locals` или `array.array.typecode`. Этот тип используется как дескриптор для атрибутов объектов; он выполняет ту же функцию, что и тип [`property`](https://python-all.ru/3.4/library/functions.html#property), но для классов, определённых в расширениях.122123#### `types.MemberDescriptorType`124125Тип объектов, определённых в расширениях модулей с помощью `PyMemberDef`, таких как `datetime.timedelta.days`. Этот тип используется как дескриптор для простых C-членов, которые используют стандартные функции преобразования; он выполняет ту же функцию, что и тип [`property`](https://python-all.ru/3.4/library/functions.html#property), но для классов, определённых в расширениях.126127**Особенности реализации CPython:** В других реализациях Python этот тип может быть идентичен `GetSetDescriptorType`.128129#### `class types.MappingProxyType(mapping)`130131Прокси-объект отображения только для чтения. Он предоставляет динамическое представление записей отображения, что означает, что при изменении отображения представление отражает эти изменения.132133Новое в версии 3.3.134135#### `key in proxy`136137Возвращает `True`, если базовое отображение содержит ключ *key*, иначе `False`.138139#### `proxy[key]`140141Возвращает элемент базового отображения с ключом *key*. Вызывает [`KeyError`](https://python-all.ru/3.4/library/exceptions.html#KeyError), если *key* отсутствует в базовом отображении.142143#### `iter(proxy)`144145Возвращает итератор по ключам базового отображения. Это сокращение для `iter(proxy.keys())`.146147#### `len(proxy)`148149Возвращает количество элементов в базовом отображении.150151#### `copy()`152153Возвращает поверхностную копию базового отображения.154155#### `get(key[, default])`156157Возвращает значение для *key*, если *key* присутствует в базовом отображении, иначе *default*. Если *default* не указан, по умолчанию используется `None`, так что этот метод никогда не вызывает [`KeyError`](https://python-all.ru/3.4/library/exceptions.html#KeyError).158159#### `items()`160161Возвращает новое представление элементов базового отображения (`(key, value)` пары).162163#### `keys()`164165Возвращает новое представление ключей базового отображения.166167#### `values()`168169Возвращает новое представление значений базового отображения.170171## 8.9.3. Дополнительные служебные классы и функции172173#### `class types.SimpleNamespace`174175Простой подкласс [`object`](https://python-all.ru/3.4/library/functions.html#object), предоставляющий доступ к атрибутам своего пространства имён, а также осмысленное представление (repr).176177В отличие от [`object`](https://python-all.ru/3.4/library/functions.html#object), с `SimpleNamespace` можно добавлять и удалять атрибуты. Если объект `SimpleNamespace` инициализируется именованными аргументами, они напрямую добавляются в базовое пространство имён.178179Этот тип примерно эквивалентен следующему коду:180181```python182class SimpleNamespace:183    def __init__(self, **kwargs):184        self.__dict__.update(kwargs)185    def __repr__(self):186        keys = sorted(self.__dict__)187        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)188        return "{}({})".format(type(self).__name__, ", ".join(items))189    def __eq__(self, other):190        return self.__dict__ == other.__dict__191```192193`SimpleNamespace` может быть полезен как замена `class NS: pass`. Однако для структурированного типа записей лучше использовать [`namedtuple()`](https://python-all.ru/3.4/library/collections.html#collections.namedtuple).194195Новое в версии 3.3.196197#### `types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)`198199Перенаправляет доступ к атрибуту класса в \_\_getattr\_\_.200201Это дескриптор, используемый для определения атрибутов, которые ведут себя по-разному при доступе через экземпляр и через класс. Доступ через экземпляр остаётся обычным, но доступ к атрибуту через класс будет перенаправлен в метод \_\_getattr\_\_ класса; это достигается возбуждением исключения AttributeError.202203Это даёт возможность иметь свойства, активные на экземпляре, и виртуальные атрибуты с тем же именем на классе (пример – Enum).204205Новое в версии 3.4.206