Содержание страницы
Объекты типов¶Type Objects
-
type PyTypeObject¶
- Часть Stable ABI (как непрозрачная структура).
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и устанавливает исключение.В сборках со свободной многопоточностью
PyType_AddWatcher()не является потокобезопасным, поэтому он должен вызываться при запуске (до создания первого потока).Добавлено в версии 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.
Изменено в версии 3.15: Теперь колбэк также вызывается при освобождении наблюдаемого типа, размещённого в куче.
-
int PyType_Unwatch(int watcher_id, PyObject *type)¶
Помечает type как неотслеживаемый. Это отменяет предыдущий вызов
PyType_Watch(). type не должен бытьNULL.Расширение никогда не должно вызывать эту функцию с watcher_id, который не был возвращён ему предыдущим вызовом
PyType_AddWatcher().При успехе функция возвращает
0. При неудаче функция возвращает-1с установленным исключением.Добавлено в версии 3.12.
-
typedef int (*PyType_WatchCallback)(PyObject *type)¶
Тип колбэк-функции отслеживания типов.
Колбэк не должен изменять type или приводить к вызову
PyType_Modified()для type или любого типа в его MRO; нарушение этого правила может привести к бесконечной рекурсии.Колбэк может вызываться во время освобождения типа. В этом случае объект типа временно воскрешается (его счётчик ссылок не меньше 1), и все его атрибуты остаются корректными. Однако колбэк не должен сохранять новые сильные ссылки на тип, так как это воскресит объект и предотвратит его освобождение.
Добавлено в версии 3.12.
Изменено в версии 3.15: Теперь колбэк может вызываться во время освобождения отслеживаемого динамического типа.
-
int PyType_HasFeature(PyTypeObject *o, int feature)¶
Возвращает ненулевое значение, если объект типа o устанавливает признак feature. Признаки типов обозначаются одноразрядными флагами.
-
int PyType_FastSubclass(PyTypeObject *type, int flag)¶
Возвращает ненулевое значение, если объект типа type устанавливает флаг подкласса flag. Флаги подклассов обозначаются
Py_TPFLAGS_*_SUBCLASS. Эта функция используется многими функциями_Checkдля распространённых типов.См. также
PyObject_TypeCheck(), который используется как более медленная альтернатива в функциях_Checkдля типов, не имеющих флагов подклассов.
-
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 по умолчанию для выделения памяти под новый экземпляр, обнуляет память, а затем инициализирует её, как при вызовеPyObject_Init()илиPyObject_InitVar().Не вызывайте это напрямую для выделения памяти под объект; вместо этого вызывайте слот
tp_allocтипа.Для типов, поддерживающих сборку мусора (т.е. установлен флаг
Py_TPFLAGS_HAVE_GC), эта функция ведёт себя какPyObject_GC_NewилиPyObject_GC_NewVar(за исключением того, что память гарантированно обнуляется перед инициализацией), и должна использоваться в паре сPyObject_GC_Del()вtp_free. В противном случае она ведёт себя какPyObject_NewилиPyObject_NewVar(с той же гарантией обнуления) и должна использоваться в паре сPyObject_Free()вtp_free.
-
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_GCin its flags, then the GC protocol will be automatically implemented from its parents. On the contrary, if the type being created does includePy_TPFLAGS_HAVE_GCin its flags then it must implement the GC protocol itself by at least implementing thetp_traversehandle.
-
PyObject *PyType_GetName(PyTypeObject *type)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.11.
Возвращает имя типа. Эквивалентно получению атрибута
__name__типа.Добавлено в версии 3.12.
-
PyObject *PyType_GetQualName(PyTypeObject *type)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.11.
Возвращает квалифицированное имя типа. Эквивалентно получению атрибута
__qualname__типа.Добавлено в версии 3.12.
-
PyObject *PyType_GetFullyQualifiedName(PyTypeObject *type)¶
- Часть Stable ABI, начиная с версии 3.13.
Возвращает полное квалифицированное имя типа. Эквивалентно
f"{type.__module__}.{type.__qualname__}"илиtype.__qualname__, еслиtype.__module__не является строкой или равно"builtins".Добавлено в версии 3.13.
-
PyObject *PyType_GetModuleName(PyTypeObject *type)¶
- Часть Stable ABI, начиная с версии 3.13.
Возвращает имя модуля типа. Эквивалентно получению атрибута
type.__module__.Добавлено в версии 3.13.
-
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().Возвращаемая ссылка является заимствованной от type и будет действительна, пока существует ссылка на type. Не освобождайте её с помощью
Py_DECREF()или аналогичных средств.Если с данным типом не связан ни один модуль, устанавливает
TypeErrorи возвращаетNULL.Эта функция обычно используется для получения модуля, в котором определён метод. Обратите внимание, что в таком методе
PyType_GetModule(Py_TYPE(self))может вернуть неожиданный результат.Py_TYPE(self)может быть подклассом целевого класса, а подклассы не обязательно определены в том же модуле, что и их суперкласс. См.PyCMethodдля получения класса, определяющего метод. См.PyType_GetModuleByToken()для случаев, когда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_GetModuleByToken(PyTypeObject *type, const void *mod_token)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.15.
Находит первый суперкласс, модуль которого имеет указанный токен модуля, и возвращает этот модуль.
Если модуль не найден, возбуждает
TypeErrorи возвращаетNULL.Эта функция предназначена для использования совместно с
PyModule_GetState()для получения состояния модуля из слотовых методов (таких какtp_initилиnb_add) и других мест, где определяющий класс метода не может быть передан с помощью соглашения о вызовеPyCMethod.Добавлено в версии 3.15.
-
PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)¶
- Возвращаемое значение: заимствованная ссылка. Часть Stable ABI начиная с версии 3.13.
Находит первый суперкласс, модуль которого был создан из указанного
PyModuleDefdef, или чей токен модуля равен def, и возвращает этот модуль.Обратите внимание, что модули, созданные из
PyModuleDef, всегда имеют свой токен, установленный на адресPyModuleDef. Другими словами, эта функция эквивалентнаPyType_GetModuleByToken(), за исключением того, что она:возвращает заимствованную ссылку, и
имеет тип аргумента, отличный от
void*(что является косметическим различием в C).
Возвращаемая ссылка является заимствованной от type и будет действительна, пока существует ссылка на type. Не освобождайте её с помощью
Py_DECREF()или аналогичных средств.Добавлено в версии 3.12.
-
int PyType_GetBaseByToken(PyTypeObject *type, void *tp_token, PyTypeObject **result)¶
- Часть Stable ABI начиная с версии 3.14.
Находит первый суперкласс в type в порядке разрешения методов, чей
Py_tp_tokenтокен равен tp_token.Если найдено, установить *result в новую сильную ссылку на него и вернуть
1.Если не найдено, установить *result в
NULLи вернуть0.При ошибке установить *result в
NULLи вернуть-1с установленным исключением.
Аргумент result может быть равен
NULL, и в этом случае *result не устанавливается. Используйте это, если нужно только возвращаемое значение.Аргумент tp_token не может быть равен
NULL.Добавлено в версии 3.14.
-
int PyUnstable_Type_AssignVersionTag(PyTypeObject *type)¶
- Это нестабильное API. Оно может меняться без предупреждения в минорных версиях.
Пытается назначить версионный тег заданному типу.
Возвращает 1, если тип уже имел допустимый версионный тег или был назначен новый, или 0, если новый тег не удалось назначить.
Добавлено в версии 3.12.
-
int PyType_SUPPORTS_WEAKREFS(PyTypeObject *type)¶
Возвращает true, если экземпляры type поддерживают создание слабых ссылок, и false в противном случае. Эта функция всегда завершается успешно. type не должен быть
NULL.См. также
Объекты слабых ссылокWeak Reference Objects
Создание типов, размещаемых в куче¶Creating Heap-Allocated Types
Следующая функция используется для создания типов, размещаемых в куче:
-
PyObject *PyType_FromSlots(const PySlot *slots)¶
- Часть Stable ABI начиная с версии 3.15.
Создаёт и возвращает тип, размещаемый в куче, из массива
PySlot. Смотрите Определение слотов для общей информации о слотах, и Идентификаторы слотов типов для слотов, специфичных для создания типов.Эта функция вызывает
PyType_Ready()для нового типа.Обратите внимание, что эта функция не полностью соответствует поведению вызова
type()или использования оператораclass. С пользовательскими базовыми типами или метаклассами предпочтительнее вызовtype(или метакласса) вместо функцийPyType_From*. В частности:__new__()не вызывается для нового класса (и должен быть установлен вtype.__new__).__init__()не вызывается для нового класса.__init_subclass__()не вызывается ни для каких базовых классов.__set_name__()не вызывается для новых дескрипторов.
Слоты обычно определяются как глобальные статические константные массивы. Однако иногда значения слотов не известны статически на этапе компиляции. Например, такие слоты, как
Py_tp_bases,Py_tp_metaclassиPy_tp_module, требуют живых объектов Python. В этом случае рекомендуется размещать такие слоты на стеке и использоватьPy_slot_subslotsдля ссылки на массив статических слотов. Например:static const PySlot my_slots[] = { PySlot_STATIC_DATA(Py_tp_name, "MyClass"), PySlot_FUNC(Py_tp_repr, my_repr_func), ... PySlot_END }; PyObject *make_my_class(PyObject *module) { PySlot all_slots[] = { PySlot_STATIC_DATA(Py_slot_subslots, my_slots), PySlot_DATA(Py_tp_module, module), PySlot_END }; return PyType_FromSlots(all_slots); }
Типы, размещаемые в куче, созданные без флага Py_TPFLAGS_IMMUTABLETYPE, могут быть
изменены, например, путём установки атрибутов, как и классы, определённые
в коде Python.
Иногда такие изменения необходимы для полной инициализации типа,
но может потребоваться запретить пользователям изменять тип после
завершения инициализации:
-
int PyType_Freeze(PyTypeObject *type)¶
- Часть Stable ABI начиная с версии 3.14.
Делает тип неизменяемым: установить флаг
Py_TPFLAGS_IMMUTABLETYPE.Все базовые классы type должны быть неизменяемыми.
При успехе возвращает
0. При ошибке устанавливает исключение и возвращает-1.Тип не должен использоваться до того, как он станет неизменяемым. Например, экземпляры типа не должны создаваться до того, как тип станет неизменяемым.
Добавлено в версии 3.14.
Идентификаторы слотов типов¶Type slot IDs
Большинство идентификаторов слотов типов именуются по образцу названий полей структур
PyTypeObject, PyNumberMethods,
PySequenceMethods, PyMappingMethods и
PyAsyncMethods с добавлением префикса Py_.
Например, используйте:
Py_tp_deallocдля установкиPyTypeObject.tp_deallocPy_nb_addдля установкиPyNumberMethods.nb_addPy_sq_lengthдля установкиPySequenceMethods.sq_length
Следующие слоты требуют дополнительного рассмотрения при указании в качестве слотов:
Дополнительные слоты не соответствуют напрямую полю структуры PyTypeObject:
Следующие поля «offset» нельзя задать с помощью 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.
Следующие внутренние поля вообще нельзя задать при создании типа на куче:
Слот Py_tp_base эквивалентен Py_tp_bases;
оба могут быть заданы как тип или кортеж типов.
Если указаны оба, используется значение Py_tp_bases.
Значения слотов не могут быть NULL, за исключением следующих:
Py_tp_token(для ясности предпочтительнееPy_TP_USE_SPEC, а неNULL)
Изменено в версии 3.9: Слоты в PyBufferProcs могут быть заданы в неограниченном API.
Изменено в версии 3.11: bf_getbuffer и
bf_releasebuffer теперь доступны
в рамках ограниченного API.
Изменено в версии 3.14: Поле tp_vectorcall теперь можно задать
с помощью Py_tp_vectorcall. Подробнее см. документацию поля.
Изменено в версии 3.15: Слот Py_tp_bases теперь может быть задан как одиночный объект типа,
что делает его эквивалентным слоту Py_tp_base.
Ранее требовался кортеж типов.
Следующие слоты соответствуют полям в базовой структуре типа, но требуют дополнительных замечаний при использовании в качестве слотов:
-
Py_tp_name¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля имени типа, используется для установкиPyTypeObject.tp_name.Этот слот (или
PyType_Spec.name) необходим для создания типа.Это нельзя использовать в
PyType_Spec.slots. Вместо этого используйтеPyType_Spec.name.Деталь реализации CPython: CPython обрабатывает слоты по порядку. Рекомендуется помещать
Py_tp_nameв начало массива слотов, чтобы в случае сбоя обработки последующих слотов сообщения об ошибках содержали имя.Добавлено в версии 3.15.
-
Py_tp_basicsize¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля размера экземпляра в байтах. Используется для установкиPyTypeObject.tp_basicsize.Значение должно быть положительным.
Это нельзя использовать в
PyType_Spec.slots. Вместо этого используйтеPyType_Spec.basicsize.Этот слот нельзя использовать с
PyType_GetSlot(). При необходимости используйтеPyTypeObject.tp_basicsize, но учтите, что размер типа часто считается деталью реализации.Добавлено в версии 3.15.
-
Py_tp_extra_basicsize¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля размера данных типа в байтах, то есть сколько пространства в дополнение требуется экземплярам класса сверх пространства, необходимого для суперклассов.Это значение используется вместе с размером суперклассов для установки
PyTypeObject.tp_basicsize. Python будет вставлять выравнивание по мере необходимости для соблюдения требований выравниванияtp_basicsize.Используйте
PyObject_GetTypeData(), чтобы получить указатель на память, зарезервированную таким образом для подкласса.Значение должно быть положительным. Чтобы указать, что экземплярам не требуется дополнительный размер (то есть размер должен наследоваться), опустите слот
Py_tp_extra_basicsize, а не устанавливайте его в ноль.Указание одновременно
Py_tp_basicsizeиPy_tp_extra_basicsizeявляется ошибкой.Это нельзя использовать в
PyType_Spec.slots. Вместо этого используйте отрицательноеPyType_Spec.basicsize.Этот слот нельзя использовать с
PyType_GetSlot().Добавлено в версии 3.15.
-
Py_tp_itemsize¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля размера одного элемента типа с изменяемым размером, в байтах. Используется для установкиPyTypeObject.tp_itemsize. См. документациюtp_itemsizeо возможных ограничениях.Значение должно быть положительным.
Если этот слот отсутствует,
tp_itemsizeнаследуется. Расширение произвольных классов с изменяемым размером опасно, поскольку некоторые типы используют фиксированное смещение для памяти переменного размера, которая затем может перекрываться с памятью фиксированного размера, используемой подклассом. Чтобы помочь избежать ошибок, наследованиеitemsizeвозможно только в следующих ситуациях:Базовый класс не имеет изменяемого размера (его
tp_itemsizeравно нулю).Запрошенный
PyType_Spec.basicsizeположителен, что говорит о том, что расположение памяти базового класса известно.Запрошенный
PyType_Spec.basicsizeравен нулю, что говорит о том, что подкласс не обращается к памяти экземпляра напрямую.С флагом
Py_TPFLAGS_ITEMS_AT_END.
Это нельзя использовать в
PyType_Spec.slots. Вместо этого используйтеPyType_Spec.itemsize.Этот слот нельзя использовать с
PyType_GetSlot().Добавлено в версии 3.15.
-
Py_tp_flags¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля флагов типа, используется для установкиPyTypeObject.tp_flags.Флаг
Py_TPFLAGS_HEAPTYPEне установлен,PyType_FromSpecWithBases()устанавливает его автоматически.Это нельзя использовать в
PyType_Spec.slots. Вместо этого используйте отрицательноеPyType_Spec.basicsize.Этот слот нельзя использовать с
PyType_GetSlot(). Вместо этого используйтеPyType_GetFlags().Добавлено в версии 3.15.
-
Py_tp_bases¶
- Часть Stable ABI.
Slot IDдля флагов типа, используется для установкиPyTypeObject.tp_bases.Этот слот можно установить в кортеж объектов типа, от которых должен наследоваться вновь созданный тип, как «позиционные аргументы» определения класса Python.
В качестве альтернативы слот можно установить в один объект типа, чтобы указать единственный базовый класс. Эффект аналогичен указанию кортежа из одного элемента.
Изменено в версии 3.15: Ранее
Py_tp_basesтребовал кортеж типов.
-
Py_tp_base¶
- Часть Stable ABI.
Эквивалентен
Py_tp_bases(сsв конце). Если указаны оба,Py_tp_basesимеет приоритет, и этот слот игнорируется.Изменено в версии 3.15: Ранее
Py_tp_baseтребовал один тип, а не кортеж.Мягкое устаревание с версии 3.15: Если не требуется поддержка старых версий Python, предпочтительнее использовать
Py_tp_bases.
Следующие слоты не соответствуют публичным полям в нижележащих структурах:
-
Py_tp_metaclass¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля метакласса, используемого для создания результирующего объекта типа. Если опущен, метакласс выводится из базовых классов (Py_tp_basesили аргумента bases функцииPyType_FromMetaclass()).Метаклассы, которые переопределяют
tp_new, не поддерживаются, за исключением случаев, когдаtp_newравноNULL.Это нельзя использовать в
PyType_Spec.slots. ИспользуйтеPyType_FromMetaclass(), чтобы указать метакласс сPyType_Spec.Этот слот нельзя использовать с
PyType_GetSlot(). Вместо этого используйтеPy_TYPE()на объекте типа.Добавлено в версии 3.15.
-
Py_tp_module¶
- Часть Stable ABI начиная с версии 3.15.
Slot IDдля записи модуля, в котором определяется новый класс.Значение должно быть объектом модуля. Модуль связывается с новым типом и может быть впоследствии получен с помощью
PyType_GetModule(). Связанный модуль не наследуется подклассами; его необходимо указывать для каждого класса отдельно.Это нельзя использовать в
PyType_Spec.slots. ИспользуйтеPyType_FromMetaclass(), чтобы указать модуль сPyType_Spec.Этот слот нельзя использовать с
PyType_GetSlot(). Вместо этого используйтеPyType_GetModule().Добавлено в версии 3.15.
-
Py_tp_token¶
- Часть Stable ABI начиная с версии 3.14.
Slot IDдля записи идентификатора статического расположения памяти для класса.Если класс определён с помощью
PyType_Spec, и этот spec выделен статически, токен может быть установлен на этот spec с помощью специального значенияPy_TP_USE_SPEC:static PyType_Slot foo_slots[] = { {Py_tp_token, Py_TP_USE_SPEC},
Его также можно установить на произвольный указатель, но необходимо убедиться, что:
Указатель переживает класс, чтобы он не был повторно использован для чего-то другого пока класс существует.
Он «принадлежит» тому модулю расширения, где находится класс, чтобы не конфликтовать с другими расширениями.
Используйте
PyType_GetBaseByToken(), чтобы проверить, есть ли у суперкласса класса заданный токен – то есть, совместимо ли расположение памяти.Чтобы получить токен для заданного класса (без учёта суперклассов), используйте
PyType_GetSlot()сPy_tp_token.Добавлено в версии 3.14.
-
Py_TP_USE_SPEC¶
- Часть Stable ABI начиная с версии 3.14.
Используется как значение с
Py_tp_token, чтобы установить токен наPyType_Specкласса. Может использоваться только для классов, определённых с помощьюPyType_Spec.Расширяется до
NULL.Добавлено в версии 3.14.
-
Py_tp_slots¶
- Часть Stable ABI начиная с версии 3.15.
Slot ID, который работает какPy_slot_subslots, за исключением того, что он задаёт массив структурPyType_Slot.Добавлено в версии 3.15.
Мягко устаревшее API¶Soft-deprecated API
Следующие функции мягко устарели.
Они продолжат работать, но новые возможности будут добавляться в виде слотов для
PyType_FromSlots(), а не в качестве аргументов новых функций PyType_From*.
-
PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)¶
- Часть Stable ABI начиная с версии 3.12.
Создаёт и возвращает кучевый тип из spec (см.
Py_TPFLAGS_HEAPTYPE).Аргумент метакласс, отличный от
NULL, соответствует слотуPy_tp_metaclass.Аргумент bases, отличный от
NULL, соответствует слотуPy_tp_basesи имеет приоритет над слотамиPy_tp_basesиPy_tp_bases.Аргумент модуль, отличный от
NULL, соответствует слотуPy_tp_module.Эта функция вызывает
PyType_Ready()у нового типа.Обратите внимание, что эта функция не полностью повторяет поведение вызова
type()или использования оператораclass. Подробнее см. примечание в документацииPyType_FromSlots().Добавлено в версии 3.12.
Мягкое устаревание с версии 3.16.0a0 (не выпущена): В новом коде используйте
PyType_FromSlots().
-
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, устарело.Изменено в версии 3.14: Создание классов, метакласс которых переопределяет
tp_new, больше не допускается.Мягкое устаревание с версии 3.16.0a0 (не выпущена): В новом коде используйте
PyType_FromSlots().
-
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, устарело.Изменено в версии 3.14: Создание классов, чей метакласс переопределяет
tp_new, больше не разрешено.Мягкое устаревание с версии 3.16.0a0 (не выпущена): В новом коде используйте
PyType_FromSlots().
-
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, устарело.Изменено в версии 3.14: Создание классов, чей метакласс переопределяет
tp_new, больше не разрешено.Мягкое устаревание с версии 3.16.0a0 (не выпущена): В новом коде используйте
PyType_FromSlots().
-
type PyType_Spec¶
- Часть Stable ABI (включая все члены).
Структура, определяющая поведение типа, используется для условно устаревших функций, таких как
PyType_FromMetaclass().Эта структура содержит несколько членов, которые вместо этого можно указать как slots для
PyType_FromSlots(), и массив записей слотов с более простой структурой.-
const char *name¶
Соответствует
Py_tp_name.
-
int basicsize¶
Если положительное, соответствует
Py_tp_basicsize.Если отрицательное, соответствует
Py_tp_extra_basicsize, установленному в абсолютное значение.Изменено в версии 3.12: Ранее это поле не могло быть отрицательным.
-
int itemsize¶
Соответствует
Py_tp_itemsize.
-
unsigned int flags¶
Соответствует
Py_tp_flags.
-
PyType_Slot *slots¶
Массив структур
PyType_Slot(неPySlot).Завершается специальным значением слота
{0, NULL}. Каждый идентификатор слота должен быть указан не более одного раза.-
type PyType_Slot¶
- Часть Stable ABI (включая все члены).
Структура, определяющая опциональную функциональность типа, используется для условно устаревших функций, таких как
PyType_FromMetaclass().Обратите внимание, что массив
PyType_Slotможет быть включён в массивPySlotс помощьюPy_tp_slots, и наоборот с помощьюPy_slot_subslots.Каждая структура
PyType_Slottpslotинтерпретируется как следующая структураPySlot:(PySlot){ .sl_id=tpslot.slot, .sl_flags=PySlot_INTPTR | sub_static, .sl_ptr=tpslot.func }
где
sub_staticравноPySlot_STATIC, если слот требует флаг (например, дляPy_tp_methods), или если этот флаг присутствует в «родительском» слотеPy_tp_slots(если есть).-
int slot¶
Соответствует
PySlot.sl_id.
-
void *pfunc¶
Соответствует
PySlot.sl_ptr.
-
int slot¶
-
type PyType_Slot¶
-
const char *name¶