Объекты типов
-
type PyTypeObject -
Часть Ограниченного API (как неявная структура).
C-структура объектов, используемых для описания встроенных типов.
-
PyTypeObject PyType_Type -
Часть Стабильного ABI.
Это объект типа для объектов типов; он совпадает с объектом
typeна уровне Python.
-
int PyType_Check(PyObject *o) -
Возвращает ненулевое значение, если объект o является объектом типа, включая экземпляры типов, производных от стандартного объекта типа. Возвращает 0 во всех остальных случаях. Эта функция всегда выполняется успешно.
-
int PyType_CheckExact(PyObject *o) -
Возвращает ненулевое значение, если объект o является объектом типа, но не является подтипом стандартного объекта типа. Возвращает 0 во всех остальных случаях. Эта функция всегда выполняется успешно.
-
unsigned int PyType_ClearCache() -
Часть Стабильного ABI.
Очистить внутренший кэш поиска. Возвращает текущую метку версии.
-
unsigned long PyType_GetFlags(PyTypeObject *type) -
Часть Стабильного 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) -
Часть Стабильного ABI.
Обновить кэш внутреннего поиска для типа и всех его подтипов. Эта функция должна вызываться после любого ручного изменения атрибутов или базовых классов типа.
-
int PyType_AddWatcher(PyType_WatchCallback callback) -
Зарегистрировать 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) -
Возвращает true, если объект типа включает поддержку детектора циклов; это проверяет флаг типа
Py_TPFLAGS_HAVE_GC.
-
int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b) -
Часть Стабильного ABI.
Возвращает true, если a является подтипом b.
Эта функция проверяет только фактические подтипы, что означает, что
__subclasscheck__()не вызывается для b. ВызовитеPyObject_IsSubclass()для выполнения того же проверки, что иissubclass().
-
PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems) -
Значение возврата: новая ссылка. Часть Стабильного ABI.
Универсальный обработчик для слота
tp_allocобъекта типа. Используйте механизм выделения памяти по умолчанию Python для выделения нового экземпляра и инициализации всех его содержимых к значениюNULL.
-
PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds) -
Значение возврата: новая ссылка. Часть Стабильного ABI.
Универсальный обработчик для слота
tp_newобъекта типа. Создайте новый экземпляр, используя слотtp_allocтипа.
-
int PyType_Ready(PyTypeObject *type) -
Часть Стабильного ABI.
Завершение инициализации объекта типа. Это должно быть вызвана для всех объектов типа, чтобы завершить их инициализацию. Эта функция отвечает за добавление унаследованных слотов из базового класса типа. Возвращает
0при успехе, или-1и устанавливает исключение при ошибке.Примечание
Если некоторые из базовых классов реализуют протокол GC, а предоставленный тип не включает
Py_TPFLAGS_HAVE_GCв своих флагах, то протокол GC будет автоматически реализован родительскими классами. Напротив, если создаваемый тип включаетPy_TPFLAGS_HAVE_GCв своих флагах, то он должен реализовать протокол GC сам по себе, как минимум реализовав обработчикtp_traverse.
-
PyObject *PyType_GetName(PyTypeObject *type) -
Значение возврата: Новая ссылка. Часть Стабильной ABI с версии 3.11.
Возвращает имя типа. Эквивалентно получению атрибута
__name__типа.Добавлена в версии 3.11.
-
PyObject *PyType_GetQualName(PyTypeObject *type) -
Значение возврата: Новая ссылка. Часть Стабильной ABI с версии 3.11.
Возвращает полное квалифицированное имя типа. Эквивалентно получению атрибута
__qualname__типа.Добавлена в версии 3.11.
-
PyObject *PyType_GetFullyQualifiedName(PyTypeObject *type) -
Часть Стабильной ABI с версии 3.13.
Возвращает полное квалифицированное имя типа. Эквивалентно
f"{type.__module__}.{type.__qualname__}", илиtype.__qualname__, еслиtype.__module__не является строкой или равно"builtins".Добавлена в версии 3.13.
-
PyObject *PyType_GetModuleName(PyTypeObject *type) -
Часть Стабильной ABI с версии 3.13.
Возвращает имя модуля типа. Эквивалентно получению атрибута
type.__module__.Добавлена в версии 3.13.
-
void *PyType_GetSlot(PyTypeObject *type, int slot) -
Часть Стабильной ABI с версии 3.4.
Возвращает указатель на функцию, хранящийся в заданном слоте. Если результат равен
NULL, это указывает на то, что либо слотNULL, либо функция была вызвана с некорректными параметрами. Звонящие обычно приводят указатель результата к соответствующему типу функции.См.
PyType_Slot.slotдля возможных значений аргумента slot.Добавлена в версии 3.4.
Изменено в версии 3.10:
PyType_GetSlot()теперь может принимать все типы. Ранее она была ограничена типами в куче.
-
PyObject *PyType_GetModule(PyTypeObject *type) -
Часть Стабильной 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) -
Часть Стабильной ABI с версии 3.10.
Возвращает состояние объекта модуля, связанного с заданным типом. Это сокращение для вызова
PyModule_GetState()на результате вызоваPyType_GetModule().Если с данным типом не связан модуль, устанавливает
TypeErrorи возвращаетNULL.Если у type есть связанный модуль, но его состояние
NULL, возвращаетNULLбез установки исключения.Добавлена в версии 3.9.
-
PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def) -
Часть Стабильной ABI с версии 3.13.
Находит первый суперкласс, модуль которого был создан из заданного
PyModuleDefdef и возвращает этот модуль.Если модуль не найден, генерирует
TypeErrorи возвращаетNULL.Эта функция предназначена для совместного использования с
PyModule_GetState()для получения состояния модуля из методов слотов (таких какtp_initилиnb_add) и других мест, где класс, определяющий метод, не может быть передан с помощью соглашения о вызовеPyCMethod.Добавлена в версии 3.11.
-
int PyUnstable_Type_AssignVersionTag(PyTypeObject *type) -
Это Нестабильный API. Он может изменяться без предупреждения в малых версиях.
Попытка назначить тег версии заданному типу.
Возвращает 1, если у типа уже был действительный тег версии или был назначен новый, или 0, если новый тег не смог быть назначен.
Добавлена в версии 3.12.
Создание типов, размещаемых в куче
Следующие функции и структуры используются для создания типов, размещаемых в куче.
-
PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases) -
Часть стабильной ABI с версии 3.12.
Создаёт и возвращает тип, размещаемый в куче из spec (см.
Py_TPFLAGS_HEAPTYPE).Метакласс metaclass используется для построения объекта типа. Когда metaclass
NULL, метакласс наследуется от bases (или слотов Py_tp_base[s], если basesNULL, см. ниже).Метаклассы, переопределяющие
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) -
Значение возврата: Новая ссылка. Часть стабильной 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) -
Значение возврата: Новая ссылка. Часть стабильной ABI.
Эквивалентно
PyType_FromMetaclass(NULL, NULL, spec, NULL).Изменено в версии 3.12: Функция теперь находит и использует метакласс, соответствующий базовым классам, предоставленным в слотах Py_tp_base[s]. Ранее возвращались только экземпляры
type.Метод
tp_newметакласса игнорируется. что может привести к неполной инициализации. Создание классов, метакласс которых переопределяетtp_new, устарело и в Python 3.14+ больше не допускается.
-
type PyType_Spec -
Часть Стабильного API (включая все члены).
Структура, определяющая поведение типа.
-
const char *name -
Имя типа, используемое для установки
PyTypeObject.tp_name.
-
int basicsize -
Если положительное, задаёт размер экземпляра в байтах. Используется для установки
PyTypeObject.tp_basicsize.Если ноль, задаёт, что
tp_basicsizeдолжен наследоваться.Если отрицательное, абсолютное значение указывает, сколько места экземпляры класса требуют дополнительно к суперклассу. Используйте
PyObject_GetTypeData()для получения указателя на выделенную память, специфичную для подкласса.Изменено в версии 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 -
Часть Стабильного API (включая все члены).
Структура, определяющая необязательные функциональные возможности типа, содержащая идентификатор слота и указатель на значение.
-
int slot -
Идентификатор слота.
Идентификаторы слотов называются так же, как имена полей структур
PyTypeObject,PyNumberMethods,PySequenceMethods,PyMappingMethodsиPyAsyncMethodsс добавлением префиксаPy_. Например, используйте:-
Py_tp_deallocдля установкиPyTypeObject.tp_dealloc -
Py_nb_addдля установкиPyNumberMethods.nb_add -
Py_sq_lengthдля установкиPySequenceMethods.sq_length
Следующие поля «смещения» не могут быть установлены с помощью
PyType_Slot:-
tp_weaklistoffset(используйтеPy_TPFLAGS_MANAGED_WEAKREFвместо этого, если возможно) -
tp_dictoffset(используйтеPy_TPFLAGS_MANAGED_DICTвместо этого, если возможно) -
tp_vectorcall_offset(используйте"__vectorcalloffset__"в PyMemberDef)
Если невозможно переключиться на флаг
MANAGED(например, для vectorcall или для поддержки Python, более старого чем 3.12), укажите смещение вPy_tp_members. См. документацию PyMemberDef для получения более подробной информации.Следующие поля вообще не могут быть установлены при создании типа в куче:
-
tp_vectorcall(используйтеtp_newи/илиtp_init) - Внутренние поля:
tp_dict,tp_mro,tp_cache,tp_subclassesиtp_weaklist.
Установка
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.
-
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/c-api/type.html