Содержание страницы
8.9. types – Создание динамических типов и имена для встроенных типов¶types – Dynamic type creation and names for built-in types
Исходный код: Lib/types.py
Этот модуль определяет вспомогательную функцию для динамического создания новых типов.
Он также определяет имена для некоторых объектных типов, которые используются стандартным
интерпретатором Python, но не доступны как встроенные, такие как int или
str.
Наконец, он предоставляет несколько дополнительных вспомогательных классов и функций, связанных с типами, которые не настолько фундаментальны, чтобы быть встроенными.
8.9.1. Создание динамических типов¶Dynamic Type Creation
-
types.new_class(name, bases=(), kwds=None, exec_body=None)¶ Динамически создаёт объект класса, используя соответствующий метакласс.
Первые три аргумента – это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку), аргументы-ключевые слова (такие как
metaclass).Аргумент exec_body – это колбэк, используемый для заполнения только что созданного пространства имён класса. Он должен принимать пространство имён класса в качестве единственного аргумента и напрямую обновлять пространство имён содержимым класса. Если колбэк не указан, эффект такой же, как при передаче
lambda ns: ns.Новое в версии 3.3.
-
types.prepare_class(name, bases=(), kwds=None)¶ Вычисляет соответствующий метакласс и создаёт пространство имён класса.
Аргументы – это компоненты, составляющие заголовок определения класса: имя класса, базовые классы (по порядку) и аргументы-ключевые слова (такие как
metaclass).Возвращаемое значение – 3-кортеж:
metaclass, namespace, kwdsmetaclass – это соответствующий метакласс, namespace – это подготовленное пространство имён класса, а kwds – это обновлённая копия переданного аргумента kwds, из которого удалена запись
'metaclass'. Если аргумент kwds не был передан, будет пустой словарь.Новое в версии 3.3.
См. также
- Настройка создания классов
- Полные сведения о процессе создания класса, поддерживаемом этими функциями
- PEP 3115 – Метаклассы в Python 3000
- Ввёл перехватчик пространства имён
__prepare__
8.9.2. Стандартные типы интерпретатора¶Standard Interpreter Types
Этот модуль предоставляет имена для многих типов, необходимых для
реализации интерпретатора Python. Он намеренно избегает включения некоторых
типов, которые возникают лишь попутно при обработке, таких как
тип listiterator.
Типичное использование этих имён – для проверок isinstance() или issubclass().
Стандартные имена определены для следующих типов:
-
types.FunctionType¶ -
types.LambdaType¶ Тип пользовательских функций и функций, созданных
lambdaвыражениями.
-
types.GeneratorType¶ Тип объектов генератора-итератора, создаваемых функциями-генераторами.
-
types.MethodType¶ Тип методов экземпляров пользовательских классов.
-
types.BuiltinFunctionType¶ -
types.BuiltinMethodType¶ Тип встроенных функций, таких как
len()илиsys.exit(), и методов встроенных классов. (Здесь термин «встроенный» означает «написанный на C».)
-
class
types.ModuleType(name, doc=None)¶ Тип модулей. Конструктор принимает имя создаваемого модуля и, опционально, его докстринг.
Примечание
importlib.util.module_from_spec()применяется для создания нового модуля, если требуется задать различные атрибуты, управляемые импортом.-
__loader__¶ Загрузчик, загрузивший модуль. По умолчанию равен
None.Изменено в версии 3.4: По умолчанию
None. Ранее атрибут был необязательным.
-
__name__¶ Имя модуля.
-
__package__¶ Пакет, к которому принадлежит модуль. Если модуль является корневым (т.е. не входит ни в один конкретный пакет), то атрибут должен быть установлен в
'', в противном случае – в имя пакета (которое может быть__name__, если сам модуль является пакетом). По умолчанию равенNone.Изменено в версии 3.4: По умолчанию
None. Ранее атрибут был необязательным.
-
-
types.TracebackType¶ Тип объектов traceback, таких как в
sys.exc_info()[2].
-
types.FrameType¶ Тип объектов фреймов, которые можно найти в
tb.tb_frame, еслиtbявляется объектом traceback.
-
types.GetSetDescriptorType¶ Тип объектов, определенных в модулях расширения с помощью
PyGetSetDef, таких какFrameType.f_localsилиarray.array.typecode. Этот тип используется в качестве дескриптора атрибутов объектов; он имеет то же назначение, что и типproperty, но для классов, определенных в модулях расширения.
-
types.MemberDescriptorType¶ Тип объектов, определённых в модулях расширения с помощью
PyMemberDef, таких какdatetime.timedelta.days. Этот тип используется как дескриптор для простых элементов данных C, которые используют стандартные функции преобразования; он имеет то же назначение, что и типproperty, но для классов, определённых в модулях расширения.Особенность реализации CPython: В других реализациях Python этот тип может быть идентичен
GetSetDescriptorType.
-
class
types.MappingProxyType(mapping)¶ Прокси-объект отображения только для чтения. Он предоставляет динамическое представление записей отображения, что означает, что при изменении отображения представление отражает эти изменения.
Новое в версии 3.3.
-
key in proxy Возвращает
True, если в базовом отображении присутствует ключ key, иначеFalse.
-
proxy[key] Возвращает элемент базового отображения с ключом key. Возбуждает исключение
KeyError, если key отсутствует в базовом отображении.
-
iter(proxy) Возвращает итератор по ключам базового отображения. Это краткая форма записи для
iter(proxy.keys()).
-
len(proxy) Возвращает количество элементов в базовом отображении.
-
copy()¶ Возвращает поверхностную копию базового отображения.
-
get(key[, default])¶ Возвращает значение для key, если key присутствует в базовом отображении, иначе default. Если default не указан, по умолчанию используется
None, так что этот метод никогда не возбуждает исключениеKeyError.
-
items()¶ Возвращает новое представление элементов базового отображения (пары
(key, value)).
-
keys()¶ Возвращает новое представление ключей базового отображения.
-
values()¶ Возвращает новое представление значений базового отображения.
-
8.9.3. Дополнительные служебные классы и функции¶Additional Utility Classes and Functions
-
class
types.SimpleNamespace¶ Простой подкласс
object, который предоставляет доступ к атрибутам своего пространства имён, а также осмысленное строковое представление.В отличие от
object, с помощьюSimpleNamespaceможно добавлять и удалять атрибуты. Если объектSimpleNamespaceинициализируется с именованными аргументами, они напрямую добавляются в базовое пространство имён.Этот тип примерно эквивалентен следующему коду:
class SimpleNamespace: def __init__(self, **kwargs): self.__dict__.update(kwargs) def __repr__(self): keys = sorted(self.__dict__) items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) return "{}({})".format(type(self).__name__, ", ".join(items)) def __eq__(self, other): return self.__dict__ == other.__dict__
SimpleNamespaceможет быть полезен в качестве заменыclass NS: pass. Однако для структурированных записей лучше использоватьnamedtuple().Новое в версии 3.3.
-
types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)¶ Перенаправляет доступ к атрибуту класса в __getattr__.
Это дескриптор, используемый для определения атрибутов, которые ведут себя по-разному при доступе через экземпляр и через класс. Доступ через экземпляр остаётся обычным, но доступ к атрибуту через класс будет перенаправлен в метод __getattr__ класса; это достигается возбуждением исключения AttributeError.
Это даёт возможность иметь свойства, активные на экземпляре, и виртуальные атрибуты с тем же именем на классе (пример – Enum).
Новое в версии 3.4.
8.9.4. Служебные функции для корутин¶Coroutine Utility Functions
-
types.coroutine(gen_func)¶ Эта функция преобразует функцию generator в корутинную функцию, которая возвращает корутину на основе генератора. Корутина на основе генератора по-прежнему является generator iterator, но также считается объектом корутины и является ожидаемым объектом. Однако она может не реализовывать метод
__await__().Если gen_func является функцией-генератором, она будет изменена на месте.
Если gen_func не является функцией-генератором, она будет обёрнута. Если она возвращает экземпляр
collections.abc.Generator, экземпляр будет обёрнут в прокси-объект, который является ожидаемым объектом. Все остальные типы объектов будут возвращены как есть.Новое в версии 3.5.