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

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).

Возвращаемое значение – кортеж из трёх элементов: metaclass, namespace, kwds

metaclass – это подходящий метакласс, 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

Тип объектов-итераторов generator, создаваемых вызовом генераторной функции.

types.CodeType

Тип объектов кода, таких как возвращаемые compile().

types.MethodType

Тип методов экземпляров пользовательских классов.

types.BuiltinFunctionType
types.BuiltinMethodType

Тип встроенных функций, таких как len() или sys.exit(), и методов встроенных классов. (Здесь термин «встроенный» означает «написанный на C».)

class types.ModuleType(name, doc=None)

Тип модулей. Конструктор принимает имя создаваемого модуля и, опционально, его докстринг.

__doc__

Докстрока модуля. По умолчанию None.

__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, предоставляющий доступ к атрибутам своего пространства имён, а также осмысленное представление (repr).

В отличие от 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.