类型对象 — Python 文档
类型对象
- type PyTypeObject
- 用于描述内置类型的对象的 C 结构。
- PyTypeObject PyType_Type
- 这是类型对象的类型对象; 它与 Python 层中的 type 对象相同。
- int PyType_Check(PyObject *o)
- 如果对象 o 是类型对象,包括从标准类型对象派生的类型实例,则返回非零值。 在所有其他情况下返回 0。 此功能总是成功。
- int PyType_CheckExact(PyObject *o)
- 如果对象 o 是类型对象,但不是标准类型对象的子类型,则返回非零值。 在所有其他情况下返回 0。 此功能总是成功。
- unsigned int PyType_ClearCache()
- 清除内部查找缓存。 返回当前版本标签。
- unsigned long PyType_GetFlags(PyTypeObject *type)
返回 type 的 tp_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 设置了特征 特征 ,则返回非零值。 类型特征由单个位标志表示。
- int PyType_IS_GC(PyTypeObject *o)
- 如果类型对象包含对循环检测器的支持,则返回 true; 这将测试类型标志 Py_TPFLAGS_HAVE_GC。
- int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
如果 a 是 b 的子类型,则返回 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)
- int PyType_Ready(PyTypeObject *type)
完成一个类型对象。 这应该在所有类型对象上调用以完成它们的初始化。 该函数负责从类型的基类添加继承的槽。 成功返回
0
,或返回-1
并在错误时设置异常。笔记
如果某些基类实现了 GC 协议,并且提供的类型在其标志中不包含 Py_TPFLAGS_HAVE_GC,则 GC 协议将从其父类自动实现。 相反,如果正在创建的类型确实在其标志中包含 Py_TPFLAGS_HAVE_GC,那么它 必须 至少通过实现 tp_traverse 句柄来实现 GC 协议本身。
- void *PyType_GetSlot(PyTypeObject *type, int slot)
返回存储在给定槽中的函数指针。 如果结果是
NULL
,这表明插槽是NULL
,或者是使用无效参数调用了该函数。 调用者通常会将结果指针转换为适当的函数类型。有关 slot 参数的可能值,请参阅
PyType_Slot.slot
。如果 type 不是堆类型,则会引发异常。
3.4 版中的新功能。
- 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)
返回与给定类型关联的模块对象的状态。 这是在 PyType_GetModule() 的结果上调用 PyModule_GetState() 的快捷方式。
如果没有模块与给定类型关联,则设置 TypeError 并返回
NULL
。如果 type 有关联模块,但其状态为
NULL
,则返回NULL
,不设置异常。3.9 版中的新功能。
创建堆分配类型
以下函数和结构用于创建 堆类型 。
- PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
从 spec (Py_TPFLAGS_HEAPTYPE) 创建并返回堆类型对象。
如果 bases 是元组,则创建的堆类型包含其中包含的所有类型作为基类型。
如果 bases 是
NULL
,则使用 Py_tp_bases 插槽。 如果这也是NULL
,则使用 Py_tp_base 插槽。 如果这也是NULL
,则新类型派生自 object。module 参数可用于记录定义新类的模块。 它必须是一个模块对象或
NULL
。 如果不是NULL
,则模块与新类型相关联,稍后可以使用 PyType_GetModule() 检索。 关联的模块不被子类继承; 必须为每个类单独指定它。此函数在新类型上调用 PyType_Ready()。
3.9 版中的新功能。
- PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
相当于
PyType_FromModuleAndSpec(NULL, spec, bases)
。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_basicsize 和 PyTypeObject.tp_itemsize。
- int PyType_Spec.flags
类型标志,用于设置PyTypeObject.tp_flags。
如果未设置
Py_TPFLAGS_HEAPTYPE
标志,则 PyType_FromSpecWithBases() 会自动设置它。
- PyType_Slot *PyType_Spec.slots
PyType_Slot 结构数组。 由特殊槽值
{0, NULL}
终止。
- const char *PyType_Spec.name
- type PyType_Slot
定义类型的可选功能的结构,包含插槽 ID 和值指针。
- int PyType_Slot.slot
插槽 ID。
插槽 ID 的命名类似于结构 PyTypeObject、PyNumberMethods、PySequenceMethods、PyMappingMethods 和 [X168syncA]PyMappingMethods[X1653X]PyMappingMethods[X1653X]PyMappingMethods]添加了
Py_
前缀。 例如,使用:Py_tp_dealloc
设置 PyTypeObject.tp_deallocPy_nb_add
设置 PyNumberMethods.nb_addPy_sq_length
设置 PySequenceMethods.sq_length
使用 PyType_Spec 和
PyType_Slot
根本无法设置以下字段:受限API下无法使用PyType_Spec和
PyType_Slot
设置以下字段:在某些平台上设置
Py_tp_bases
或Py_tp_base
可能会出现问题。 为避免出现问题,请改用PyType_FromSpecWithBases()
的 bases 参数。3.9 版更改: PyBufferProcs 中的 插槽可以在无限制 API 中设置。
- void *PyType_Slot.pfunc
插槽的所需值。 在大多数情况下,这是一个指向函数的指针。
可能不是
NULL
。
- int PyType_Slot.slot