类型对象 — Python 文档

来自菜鸟教程
Python/docs/3.8/c-api/type
跳转至:导航、​搜索

类型对象

type PyTypeObject
用于描述内置类型的对象的 C 结构。
PyObject *PyType_Type
这是类型对象的类型对象; 它与 Python 层中的 type 对象相同。
int PyType_Check(PyObject *o)
如果对象 o 是类型对象,包括从标准类型对象派生的类型实例,则返回 true。 在所有其他情况下返回 false。
int PyType_CheckExact(PyObject *o)
如果对象 o 是类型对象,但不是标准类型对象的子类型,则返回 true。 在所有其他情况下返回 false。
unsigned int PyType_ClearCache()
清除内部查找缓存。 返回当前版本标签。
unsigned long PyType_GetFlags(PyTypeObject *type)

返回 typetp_flags 成员。 此函数主要用于 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 设置了特征 特征 ,则返回 true。 类型特征由单个位标志表示。
int PyType_IS_GC(PyTypeObject *o)
如果类型对象包含对循环检测器的支持,则返回 true; 这将测试类型标志 Py_TPFLAGS_HAVE_GC
int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)

如果 ab 的子类型,则返回 true。

这个函数只检查实际的子类型,这意味着在 b 上不会调用 __subclasscheck__()。 调用 PyObject_IsSubclass() 进行与 issubclass() 相同的检查。

PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
类型对象的 tp_alloc 槽的通用处理程序。 使用Python默认的内存分配机制来分配一个新实例,并将其所有内容初始化为NULL
PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
类型对象的 tp_new 槽的通用处理程序。 使用类型的 tp_alloc 槽创建一个新实例。
int PyType_Ready(PyTypeObject *type)
完成一个类型对象。 这应该在所有类型对象上调用以完成它们的初始化。 该函数负责从类型的基类添加继承的槽。 成功返回 0,或返回 -1 并在错误时设置异常。
void *PyType_GetSlot(PyTypeObject *type, int slot)

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

有关 slot 参数的可能值,请参阅 PyType_Slot.slot

如果 type 不是堆类型,则会引发异常。

3.4 版中的新功能。

创建堆分配类型

以下函数和结构用于创建 堆类型

PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)

spec (Py_TPFLAGS_HEAPTYPE) 创建并返回堆类型对象。

如果 bases 是元组,则创建的堆类型包含其中包含的所有类型作为基类型。

如果 basesNULL,则使用 Py_tp_bases 插槽。 如果这也是 NULL,则使用 Py_tp_base 插槽代替。 如果这也是 NULL,则新类型派生自 object

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

3.3 版中的新功能。

PyObject *PyType_FromSpec(PyType_Spec *spec)
相当于 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 的命名类似于结构 PyTypeObject、PyNumberMethodsPySequenceMethodsPyMappingMethods 和 [X168syncA]PyMappingMethods[X1653X]PyMappingMethods[X1653X]PyMappingMethods]添加了 Py_ 前缀。 例如,使用:

无法使用 PyType_SpecPyType_Slot 设置以下字段:

在某些平台上设置 Py_tp_basesPy_tp_base 可能会出现问题。 为避免出现问题,请改用 PyType_FromSpecWithBases()bases 参数。

void *PyType_Slot.pfunc

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

可能不是 NULL