类型对象

type PyTypeObject

用于描述内置类型的对象的C结构。

PyObject *PyType_Type

这是类型对象的类型对象;它与 type 在python层中。

int PyType_Check(PyObject *o)

如果对象的值不为零,则返回非零值 o 是一个类型对象,包括从标准类型对象派生的类型实例。在所有其他情况下返回0。此功能总是成功的。

int PyType_CheckExact(PyObject *o)

如果对象的值不为零,则返回非零值 o 是类型对象,但不是标准类型对象的子类型。在所有其他情况下返回0。此功能总是成功的。

unsigned int PyType_ClearCache()

清除内部查找缓存。返回当前版本标记。

unsigned long PyType_GetFlags(PyTypeObject *type)

返回 tp_flags 成员 type . 此函数主要用于 Py_LIMITED_API ;单个标志位保证在整个Python版本中都是稳定的,但是可以访问 tp_flags 它本身不是受限API的一部分。

3.2 新版功能.

在 3.4 版更改: 返回类型现在为 unsigned long 而不是 long .

void PyType_Modified(PyTypeObject *type)

使类型及其所有子类型的内部查找缓存无效。必须在手动修改类型的属性或基类之后调用此函数。

int PyType_HasFeature(PyTypeObject *o, int feature)

如果类型对象为 o 设置功能 特征 . 类型特征由单个位标志表示。

int PyType_IS_GC(PyTypeObject *o)

如果类型对象包含对循环检测器的支持,则返回true;这将测试类型标志 Py_TPFLAGS_HAVE_GC .

int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)

返回true if a 是一个subtype b .

此函数只检查实际的子类型,这意味着 __subclasscheck__() 未被调用 b . 调用 PyObject_IsSubclass() 做同样的检查 issubclass() 会的。

PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
Return value: New reference.

的一般处理程序 tp_alloc 类型对象的槽。使用python的默认内存分配机制来分配新实例并将其所有内容初始化为 NULL .

PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
Return value: New reference.

的一般处理程序 tp_new 类型对象的槽。使用类型的 tp_alloc 狭槽。

int PyType_Ready(PyTypeObject *type)

完成类型对象。这应该在所有类型对象上调用,以完成初始化。此函数负责添加从类型的基类继承的槽。返回 0 成功或回来 -1 并在出错时设置异常。

void *PyType_GetSlot(PyTypeObject *type, int slot)

返回存储在给定槽中的函数指针。如果结果是 NULL ,这表示插槽 NULL 或者使用无效参数调用了函数。调用方通常会将结果指针强制转换为适当的函数类型。

PyType_Slot.slot 对于 slot 参数。

3.4 新版功能.

在 3.10 版更改: PyType_GetSlot() 现在可以接受所有类型。以前,它仅限于堆类型。

PyObject *PyType_GetModule(PyTypeObject *type)

使用创建类型时返回与给定类型关联的模块对象 PyType_FromModuleAndSpec() .

如果没有模块与给定类型关联,则设置 TypeError 回报 NULL .

此函数通常用于获取定义方法的模块。注意在这种方法中, PyType_GetModule(Py_TYPE(self)) 可能无法返回预期结果。 Py_TYPE(self) 可能是 子类 和子类不必定义在同一个模块中作为它们的超类。看到了吗 PyCMethod 获取定义方法的类。

3.9 新版功能.

void *PyType_GetModuleState(PyTypeObject *type)

返回与给定类型关联的模块对象的状态。这是打电话的捷径 PyModule_GetState() 关于结果 PyType_GetModule() .

如果没有模块与给定类型关联,则设置 TypeError 回报 NULL .

如果 type 具有关联的模块,但其状态为 NULL 回报 NULL 没有设置例外。

3.9 新版功能.

创建堆分配类型

以下函数和结构用于创建 heap types .

PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
Return value: New reference.

Creates and returns a heap type object from the spec (Py_TPFLAGS_HEAPTYPE).

这个 基地 参数可用于指定基类;它可以只是一个类,也可以是类的元组。如果 基地NULL ,即 Py_tp_bases 改为使用插槽。如果这也是 NULL ,即 Py_tp_base 改为使用插槽。如果这也是 NULL ,新类型派生自 object

这个 模块 参数可用于记录在其中定义新类的模块。它必须是模块对象或 NULL . 如果没有 NULL ,该模块与新类型关联,以后可以使用 PyType_GetModule() . 关联的模块不是由子类继承的;必须为每个类单独指定它。

此函数调用 PyType_Ready() 在新类型上。

3.9 新版功能.

在 3.10 版更改: 该函数现在接受单个类作为 基地 论证和 NULL 作为 tp_doc 插槽。

PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
Return value: New reference.

相当于 PyType_FromModuleAndSpec(NULL, spec, bases) .

3.3 新版功能.

PyObject *PyType_FromSpec(PyType_Spec *spec)
Return value: New reference.

相当于 PyType_FromSpecWithBases(spec, NULL) .

type PyType_Spec

定义类型行为的结构。

const char *PyType_Spec.name

类型的名称,用于设置 PyTypeObject.tp_name .

int PyType_Spec.basicsize
int PyType_Spec.itemsize

实例大小(字节),用于设置 PyTypeObject.tp_basicsizePyTypeObject.tp_itemsize .

int PyType_Spec.flags

类型标志,用于设置 PyTypeObject.tp_flags .

如果 Py_TPFLAGS_HEAPTYPE 未设置标志, PyType_FromSpecWithBases() 自动设置。

PyType_Slot *PyType_Spec.slots

数组 PyType_Slot 结构。由特殊槽值终止 {{0, NULL}} .

type PyType_Slot

定义类型的可选功能的结构,包含槽ID和值指针。

int PyType_Slot.slot

插槽ID。

插槽ID的命名与结构的字段名类似 PyTypeObjectPyNumberMethodsPySequenceMethodsPyMappingMethodsPyAsyncMethods 添加了 Py_ 前缀。例如,使用:

以下字段不能使用 PyType_SpecPyType_Slot

无法使用设置以下字段 PyType_SpecPyType_Slot 在有限的API下:

设置 Py_tp_basesPy_tp_base 在某些平台上可能存在问题。若要避免问题,请使用 基地 论证 PyType_FromSpecWithBases() 取而代之的是。

在 3.9 版更改: 插槽 PyBufferProcs 可以在无限API中设置。

void *PyType_Slot.pfunc

槽的所需值。在大多数情况下,这是指向函数的指针。

插槽不是 Py_tp_doc 可能不是 NULL