LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 287|回复: 0

类型对象

[复制链接]
发表于 2024-1-26 17:49:04 | 显示全部楼层 |阅读模式


type PyTypeObject
属于 受限 API (作为不透明的结构体).
对象的 C 结构用于描述 built-in 类型。

PyTypeObject PyType_Type
属于 稳定 ABI.
这是属于 type 对象的 type object,它在 Python 层面和 type 是相同的对象。

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.
返回 type 的 tp_flags 成员。 此函数主要是配合 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 作为类型监视器。 返回一个非负的整数 ID,它必须传给将来对 PyType_Watch() 的调用。 如果出错(例如没有足够的可用监视器 ID),则返回 -1 并设置一个异常。

在 3.12 版本加入.

int PyType_ClearWatcher(int watcher_id)
清除由 watcher_id (之前从 PyType_AddWatcher() 返回) 所标识的 watcher。 成功时返回 0,出错时(例如 watcher_id 未被注册)返回 -1。

扩展在调用 PyType_ClearWatcher 时绝不能使用不是之前调用 PyType_AddWatcher() 所返回的 watcher_id。

在 3.12 版本加入.

int PyType_Watch(int watcher_id, PyObject *type)
将 type 标记为已监视。 每当 PyType_Modified() 报告 type 发生变化时 PyType_AddWatcher() 赋予 watcher_id 的回调将被调用。 (如果在 type 的一系列连续修改之间没有调用 _PyType_Lookup(),则回调只能被调用一次;这是一个实现细节并可能发生变化)。

扩展在调用 PyType_Watch 时绝不能使用不是之前调用 PyType_AddWatcher() 所返回的 watcher_id。

在 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)
如果类型对象包括了对循环检测器的支持则返回真值;这将测试类型旗标 Py_TPFLAGS_HAVE_GC。

int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
属于 稳定 ABI.
如果 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 版本加入.

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 版开始.
返回关联到给定类型的模块对象的状态。 这是一个在 PyType_GetModule() 的结果上调用 PyModule_GetState() 的快捷方式。

如果没有关联到给定类型的模块,则设置 TypeError 并返回 NULL。

如果 type 有关联的模块但其状态为 NULL,则返回 NULL 且不设置异常。

在 3.9 版本加入.

PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)
找到所属模块基于给定的 PyModuleDef def 创建的第一个上级类,并返回该模块。

如果未找到模块,则会引发 TypeError 并返回 NULL。

此函数预期会与 PyModule_GetState() 一起使用以便从槽位方法 (如 tp_init 或 nb_add) 及其他定义方法的类无法使用 PyCMethod 调用惯例来传递的场合获取模块状态。

在 3.11 版本加入.

int PyUnstable_Type_AssignVersionTag(PyTypeObject *type)
这是 不稳定 API。 它可能在微发布版中不带警告地改变。
尝试为给定的类型设置一个版本标签。

如果类型已有合法的版本标签或已设置了新的版本标签则返回 1,或者如果无法设置新的标签则返回 0。

在 3.12 版本加入.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表