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

Объекты типовType Objects

type PyTypeObject
Часть Limited API (как непрозрачная структура).

C-структура объектов, используемая для описания встроенных типов.

PyTypeObject PyType_Type
Часть Stable ABI.

Это объект типа для объектов-типов; он совпадает с объектом type на уровне Python.

int PyType_Check(PyObject *o)

Возвращает ненулевое значение, если объект o является объектом-типом, включая экземпляры типов, производных от стандартного объекта-типа. Возвращает 0 во всех остальных случаях. Эта функция всегда завершается успешно.

int PyType_CheckExact(PyObject *o)

Возвращает ненулевое значение, если объект o является объектом-типом, но не подтипом стандартного объекта-типа. Возвращает 0 во всех остальных случаях. Эта функция всегда завершается успешно.

unsigned int PyType_ClearCache()
Часть Stable ABI.

Очищает внутренний кеш поиска. Возвращает текущий тег версии.

unsigned long PyType_GetFlags(PyTypeObject *type)
Часть Stable ABI.

Возвращает член tp_flags объекта type. Эта функция в первую очередь предназначена для использования с Py_LIMITED_API; отдельные биты флагов гарантированно стабильны между версиями Python, но доступ к самому tp_flags не является частью ограниченного API.

Добавлено в версии 3.2.

Изменено в версии 3.4: Тип возвращаемого значения теперь unsigned long, а не long.

PyObject *PyType_GetDict(PyTypeObject *type)

Возвращает внутреннее пространство имён объекта-типа, которое иначе доступно только через прокси только для чтения (cls.__dict__). Это замена прямого доступа к tp_dict. Возвращаемый словарь должен рассматриваться как доступный только для чтения.

Эта функция предназначена для конкретных случаев встраивания и привязки к языкам, где необходим прямой доступ к словарю, а косвенный доступ (например, через прокси или PyObject_GetAttr()) недостаточен.

Модули расширений должны продолжать использовать tp_dict, напрямую или косвенно, при создании собственных типов.

Добавлено в версии 3.12.

void PyType_Modified(PyTypeObject *type)
Часть Stable ABI.

Аннулирует внутренний кеш поиска для типа и всех его подтипов. Эта функция должна вызываться после любого ручного изменения атрибутов или базовых классов типа.

int PyType_AddWatcher(PyType_WatchCallback callback)

Регистрирует колбэк в качестве наблюдателя за типами. Возвращает неотрицательный целочисленный идентификатор, который должен передаваться в последующие вызовы PyType_Watch(). В случае ошибки (например, закончились доступные идентификаторы наблюдателей) возвращает -1 и устанавливает исключение.

Добавлено в версии 3.12.

int PyType_ClearWatcher(int watcher_id)

Удаляет наблюдателя, идентифицированного по watcher_id (ранее возвращённого из PyType_AddWatcher()). Возвращает 0 при успехе, -1 при ошибке (например, если watcher_id никогда не был зарегистрирован).

Расширение никогда не должно вызывать PyType_ClearWatcher с watcher_id, который не был возвращён ему предыдущим вызовом PyType_AddWatcher().

Добавлено в версии 3.12.

int PyType_Watch(int watcher_id, PyObject *type)

Помечает type как наблюдаемый. Колбэк, получивший watcher_id от PyType_AddWatcher(), будет вызываться каждый раз, когда PyType_Modified() сообщает об изменении type. (Колбэк может вызываться только один раз для серии последовательных изменений type, если _PyType_Lookup() не вызывается для type между изменениями; это деталь реализации и может измениться.)

Расширение никогда не должно вызывать PyType_Watch с watcher_id, который не был возвращён ему предыдущим вызовом PyType_AddWatcher().

Добавлено в версии 3.12.

typedef int (*PyType_WatchCallback)(PyObject *type)

Тип колбэк-функции отслеживания типов.

Колбэк не должен изменять type или приводить к вызову PyType_Modified() для type или любого типа в его MRO; нарушение этого правила может привести к бесконечной рекурсии.

Добавлено в версии 3.12.

int PyType_HasFeature(PyTypeObject *o, int feature)

Возвращает ненулевое значение, если объект типа o устанавливает признак feature. Признаки типов обозначаются одноразрядными флагами.

int PyType_IS_GC(PyTypeObject *o)

Возвращает истину, если объект типа поддерживает детектор циклов; это проверяет флаг типа Py_TPFLAGS_HAVE_GC.

int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
Часть Stable ABI.

Возвращает истину, если a является подтипом b.

Эта функция проверяет только непосредственные подтипы, то есть __subclasscheck__() не вызывается для b. Вызовите PyObject_IsSubclass(), чтобы выполнить ту же проверку, что и issubclass() .

PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
Возвращаемое значение: новая ссылка. Часть Stable ABI.

Универсальный обработчик для слота tp_alloc объекта-типа. Использует стандартный механизм выделения памяти Python для создания нового экземпляра и инициализации всего его содержимого значением NULL.

PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
Возвращаемое значение: новая ссылка. Часть Stable ABI.

Универсальный обработчик для слота tp_new объекта-типа. Создаёт новый экземпляр, используя слот tp_alloc типа.

int PyType_Ready(PyTypeObject *type)
Часть Stable ABI.

Завершает инициализацию объекта типа. Должна вызываться для всех объектов типа, чтобы завершить их инициализацию. Эта функция отвечает за добавление наследуемых слотов из базового класса. Возвращает 0 при успехе, или -1 и устанавливает исключение при ошибке.

Примечание

If some of the base classes implements the GC protocol and the provided type does not include the Py_TPFLAGS_HAVE_GC in its flags, then the GC protocol will be automatically implemented from its parents. On the contrary, if the type being created does include Py_TPFLAGS_HAVE_GC in its flags then it must implement the GC protocol itself by at least implementing the tp_traverse handle.

PyObject *PyType_GetName(PyTypeObject *type)
Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.11.

Возвращает имя типа. Эквивалентно получению атрибута __name__ типа.

Добавлено в версии 3.12.

PyObject *PyType_GetQualName(PyTypeObject *type)
Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.11.

Возвращает квалифицированное имя типа. Эквивалентно получению атрибута __qualname__ типа.

Добавлено в версии 3.12.

void *PyType_GetSlot(PyTypeObject *type, int slot)
Часть Stable ABI начиная с версии 3.4.

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

См. PyType_Slot.slot для возможных значений аргумента slot.

Добавлено в версии 3.4.

Изменено в версии 3.10: PyType_GetSlot() теперь может принимать все типы. Ранее он был ограничен динамическими типами (heap types).

PyObject *PyType_GetModule(PyTypeObject *type)
Часть Stable ABI начиная с версии 3.10.

Возвращает объект модуля, связанный с данным типом, если тип был создан с помощью PyType_FromModuleAndSpec().

Если с данным типом не связан ни один модуль, устанавливает TypeError и возвращает NULL.

Эта функция обычно используется для получения модуля, в котором определён метод. Обратите внимание: в таком методе PyType_GetModule(Py_TYPE(self)) может не вернуть ожидаемый результат. Py_TYPE(self) может оказаться подклассом нужного класса, а подклассы необязательно определены в том же модуле, что и их суперкласс. См. PyCMethod, чтобы получить класс, определяющий метод. См. PyType_GetModuleByDef() для случаев, когда PyCMethod нельзя использовать.

Добавлено в версии 3.9.

void *PyType_GetModuleState(PyTypeObject *type)
Часть Stable ABI начиная с версии 3.10.

Возвращает состояние объекта модуля, связанного с данным типом. Это сокращение для вызова PyModule_GetState() для результата PyType_GetModule().

Если с данным типом не связан ни один модуль, устанавливает TypeError и возвращает NULL.

Если с type связан модуль, но его состояние равно NULL, возвращает NULL без установки исключения.

Добавлено в версии 3.9.

PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)

Найти первый суперкласс, модуль которого был создан из заданного PyModuleDef def, и вернуть этот модуль.

Если модуль не найден, возбуждает TypeError и возвращает NULL.

Эта функция предназначена для использования совместно с PyModule_GetState() для получения состояния модуля из слотовых методов (таких как tp_init или nb_add) и других мест, где определяющий класс метода не может быть передан с помощью соглашения о вызове PyCMethod.

Добавлено в версии 3.12.

int PyUnstable_Type_AssignVersionTag(PyTypeObject *type)
Это нестабильное API. Оно может меняться без предупреждения в минорных версиях.

Пытается назначить версионный тег заданному типу.

Возвращает 1, если тип уже имел допустимый версионный тег или был назначен новый, или 0, если новый тег не удалось назначить.

Добавлено в версии 3.12.

Создание типов, размещаемых в кучеCreating Heap-Allocated Types

Следующие функции и структуры используются для создания динамических типов.

PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)
Часть Stable ABI начиная с версии 3.12.

Создаёт и возвращает кучевый тип из spec (см. Py_TPFLAGS_HEAPTYPE).

Метакласс metaclass используется для построения результирующего объекта типа. Если metaclass равен NULL, метакласс наследуется от bases (или слотов Py_tp_base[s], если bases равно NULL, см. ниже).

Метаклассы, переопределяющие tp_new, не поддерживаются, за исключением случаев, когда tp_new равен NULL. (Для обратной совместимости другие функции PyType_From* допускают такие метаклассы. Они игнорируют tp_new, что может привести к неполной инициализации. Это устарело, и в Python 3.14+ такие метаклассы не будут поддерживаться.)

Аргумент bases можно использовать для указания базовых классов; он может быть как одним классом, так и кортежем классов. Если bases равен NULL, вместо него используется слот Py_tp_bases. Если и он равен NULL, вместо него используется слот Py_tp_base. Если и он равен NULL, новый тип наследуется от object.

Аргумент module можно использовать для записи модуля, в котором определён новый класс. Он должен быть объектом модуля или NULL. Если не NULL, модуль связывается с новым типом и впоследствии может быть получен с помощью PyType_GetModule(). Связанный модуль не наследуется подклассами; его нужно указывать для каждого класса отдельно.

Эта функция вызывает PyType_Ready() у нового типа.

Обратите внимание, что эта функция не полностью соответствует поведению вызова type() или использования оператора class. С пользовательскими базовыми типами или метаклассами предпочтительнее вызов type (или метакласса) вместо функций PyType_From*. В частности:

  • __new__() не вызывается для нового класса (и должен быть установлен в type.__new__).

  • __init__() не вызывается для нового класса.

  • __init_subclass__() не вызывается ни для каких базовых классов.

  • __set_name__() не вызывается для новых дескрипторов.

Добавлено в версии 3.12.

PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.10.

Эквивалентно PyType_FromMetaclass(NULL, module, spec, bases).

Добавлено в версии 3.9.

Изменено в версии 3.10: Функция теперь принимает один класс в качестве аргумента bases и NULL в качестве слота tp_doc.

Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий указанным базовым классам. Ранее возвращались только экземпляры type.

tp_new метакласса игнорируется. Это может привести к неполной инициализации. Создание классов, метакласс которых переопределяет tp_new, устарело, и в Python 3.14+ оно будет запрещено.

PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
Возвращаемое значение: новая ссылка. Часть стабильного ABI начиная с версии 3.3.

Эквивалентно PyType_FromMetaclass(NULL, NULL, spec, bases).

Добавлено в версии 3.3.

Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий указанным базовым классам. Ранее возвращались только экземпляры type.

tp_new метакласса игнорируется. Это может привести к неполной инициализации. Создание классов, метакласс которых переопределяет tp_new, устарело, и в Python 3.14+ оно будет запрещено.

PyObject *PyType_FromSpec(PyType_Spec *spec)
Возвращаемое значение: новая ссылка. Часть Stable ABI.

Эквивалентно PyType_FromMetaclass(NULL, NULL, spec, NULL).

Изменено в версии 3.12: Теперь функция находит и использует метакласс, соответствующий базовым классам, указанным в слотах Py_tp_base[s]. Ранее возвращались только экземпляры type.

tp_new метакласса игнорируется. Это может привести к неполной инициализации. Создание классов, метакласс которых переопределяет tp_new, устарело, и в Python 3.14+ оно будет запрещено.

type PyType_Spec
Часть Stable ABI (включая все члены).

Структура, определяющая поведение типа.

const char *name

Имя типа, используемое для установки PyTypeObject.tp_name.

int basicsize

Если положительное, задаёт размер экземпляра в байтах. Используется для установки PyTypeObject.tp_basicsize.

Если равно нулю, указывает, что tp_basicsize должен наследоваться.

Если отрицательное, абсолютное значение указывает, сколько дополнительного места требуется экземплярам класса сверх суперкласса. Используйте PyObject_GetTypeData() для получения указателя на память, зарезервированную таким образом для подкласса. Для отрицательного basicsize Python при необходимости вставляет выравнивание, чтобы удовлетворить требованиям выравнивания tp_basicsize.

Изменено в версии 3.12: Ранее это поле не могло быть отрицательным.

int itemsize

Размер одного элемента типа переменного размера в байтах. Используется для установки PyTypeObject.tp_itemsize. См. документацию tp_itemsize о предостережениях.

Если равно нулю, tp_itemsize наследуется. Расширение произвольных классов переменного размера опасно, поскольку некоторые типы используют фиксированное смещение для памяти переменного размера, которая может затем перекрыться с памятью фиксированного размера, используемой подклассом. Чтобы предотвратить ошибки, наследование itemsize возможно только в следующих ситуациях:

  • Базовый тип не является типом переменного размера (его tp_itemsize).

  • Запрошенный PyType_Spec.basicsize положителен, что говорит о том, что расположение памяти базового класса известно.

  • Запрошенный PyType_Spec.basicsize равен нулю, что говорит о том, что подкласс не обращается к памяти экземпляра напрямую.

  • С флагом Py_TPFLAGS_ITEMS_AT_END.

unsigned int flags

Флаги типа, используются для установки PyTypeObject.tp_flags.

Если флаг Py_TPFLAGS_HEAPTYPE не установлен, PyType_FromSpecWithBases() устанавливает его автоматически.

PyType_Slot *slots

Массив структур PyType_Slot. Завершается специальным значением слота {0, NULL}.

Каждый идентификатор слота должен быть указан не более одного раза.

type PyType_Slot
Часть Stable ABI (включая все члены).

Структура, определяющая дополнительную функциональность типа, содержащая идентификатор слота и указатель на значение.

int slot

Идентификатор слота.

Идентификаторы слотов именуются подобно именам полей структур PyTypeObject, PyNumberMethods, PySequenceMethods, PyMappingMethods и PyAsyncMethods с добавлением префикса Py_. Например, используйте:

Следующие поля «offset» нельзя задать с помощью PyType_Slot:

Если невозможно переключиться на флаг MANAGED (например, для vectorcall или для поддержки Python версии ниже 3.12), укажите смещение в Py_tp_members. Подробнее см. документацию PyMemberDef.

Следующие поля вообще нельзя задать при создании динамического типа:

Установка Py_tp_bases или Py_tp_base может быть проблематичной на некоторых платформах. Чтобы избежать проблем, используйте аргумент bases функции PyType_FromSpecWithBases() вместо этого.

Изменено в версии 3.9: Слоты в PyBufferProcs могут быть заданы в неограниченном API.

Изменено в версии 3.11: bf_getbuffer и bf_releasebuffer теперь доступны в рамках ограниченного API.

void *pfunc

Желаемое значение слота. В большинстве случаев это указатель на функцию.

Слоты, отличные от Py_tp_doc, не могут быть NULL.