“Python/docs/3.9/c-api/type”的版本间差异
(autoload) |
小 (Page commit) |
||
第1行: | 第1行: | ||
+ | {{DISPLAYTITLE:类型对象 — Python 文档}} | ||
<div id="type-objects" class="section"> | <div id="type-objects" class="section"> | ||
<span id="typeobjects"></span> | <span id="typeobjects"></span> | ||
− | = | + | = 类型对象 = |
<span id="index-0" class="target"></span> | <span id="index-0" class="target"></span> | ||
− | ; | + | ; <span class="k"><span class="pre">type</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyTypeObject</span></span></span><br /> |
− | |||
− | + | : 用于描述内置类型的对象的 C 结构。 | |
− | : | ||
− | ; | + | ; [[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyType_Type</span></span></span><br /> |
− | |||
− | + | : 这是类型对象的类型对象; 它与 Python 层中的 [[../../library/functions#type|type]] 对象相同。 | |
− | |||
− | ; unsigned int < | + | ; <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyType_Check</span></span></span><span class="sig-paren">(</span>[[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">o</span></span><span class="sig-paren">)</span><br /> |
− | : | + | |
+ | : 如果对象 ''o'' 是类型对象,包括从标准类型对象派生的类型实例,则返回非零值。 在所有其他情况下返回 0。 此功能总是成功。 | ||
+ | |||
+ | ; <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyType_CheckExact</span></span></span><span class="sig-paren">(</span>[[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">o</span></span><span class="sig-paren">)</span><br /> | ||
+ | |||
+ | : 如果对象 ''o'' 是类型对象,但不是标准类型对象的子类型,则返回非零值。 在所有其他情况下返回 0。 此功能总是成功。 | ||
+ | |||
+ | ; <span class="kt"><span class="pre">unsigned</span> <span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyType_ClearCache</span></span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><br /> | ||
+ | |||
+ | : 清除内部查找缓存。 返回当前版本标签。 | ||
<dl> | <dl> | ||
− | <dt>unsigned long < | + | <dt><span class="kt"><span class="pre">unsigned</span> <span class="pre">long</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyType_GetFlags</span></span></span><span class="sig-paren">(</span>[[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span><span class="sig-paren">)</span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>返回 ''type'' 的 [[../typeobj#c.PyTypeObject|tp_flags]] 成员。 此函数主要用于 Py_LIMITED_API; 各个标志位保证在 Python 版本中稳定,但对 [[../typeobj#c.PyTypeObject|tp_flags]] 本身的访问不是受限 API 的一部分。</p> | |
− | |||
− | [[../typeobj#c.PyTypeObject| | ||
<div class="versionadded"> | <div class="versionadded"> | ||
− | <p><span class="versionmodified added">3.2 | + | <p><span class="versionmodified added">3.2 版中的新功能。</span></p> |
</div> | </div> | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed"> | + | <p><span class="versionmodified changed"> 3.4 版更改: </span> 返回类型现在是 <code>unsigned long</code> 而不是 <code>long</code>。</p> |
</div></dd></dl> | </div></dd></dl> | ||
− | ; void < | + | ; <span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyType_Modified</span></span></span><span class="sig-paren">(</span>[[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span><span class="sig-paren">)</span><br /> |
− | : | + | |
+ | : 使该类型及其所有子类型的内部查找缓存无效。 在对该类型的属性或基类进行任何手动修改后,必须调用此函数。 | ||
− | ; int < | + | ; <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyType_HasFeature</span></span></span><span class="sig-paren">(</span>[[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">o</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">feature</span></span><span class="sig-paren">)</span><br /> |
− | |||
− | ; int < | + | : 如果类型对象 ''o'' 设置了特征 ''特征'' ,则返回非零值。 类型特征由单个位标志表示。 |
− | : | + | |
+ | ; <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyType_IS_GC</span></span></span><span class="sig-paren">(</span>[[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">o</span></span><span class="sig-paren">)</span><br /> | ||
+ | |||
+ | : 如果类型对象包含对循环检测器的支持,则返回 true; 这将测试类型标志 [[../typeobj#Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_GC]]。 | ||
<dl> | <dl> | ||
− | <dt>int < | + | <dt><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyType_IsSubtype</span></span></span><span class="sig-paren">(</span>[[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">a</span></span>, [[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">b</span></span><span class="sig-paren">)</span><br /> |
− | <dd><p> | + | </dt> |
− | <p> | + | <dd><p>如果 ''a'' 是 ''b'' 的子类型,则返回 true。</p> |
− | [[../../reference/datamodel#class| | + | <p>这个函数只检查实际的子类型,这意味着在 ''b'' 上不会调用 [[../../reference/datamodel#class|__subclasscheck__()]]。 调用 [[../object#c|PyObject_IsSubclass()]] 进行与 [[../../library/functions#issubclass|issubclass()]] 相同的检查。</p></dd></dl> |
− | [[../ | + | |
− | + | ; [[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyType_GenericAlloc</span></span></span><span class="sig-paren">(</span>[[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span>, <span class="n"><span class="pre">Py_ssize_t</span></span><span class="w"> </span><span class="n"><span class="pre">nitems</span></span><span class="sig-paren">)</span><br /> | |
+ | |||
+ | : 类型对象的 [[../typeobj#c.PyTypeObject|tp_alloc]] 槽的通用处理程序。 使用Python默认的内存分配机制来分配一个新实例,并将其所有内容初始化为<code>NULL</code>。 | ||
+ | |||
+ | ; [[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyType_GenericNew</span></span></span><span class="sig-paren">(</span>[[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span>, [[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span>, [[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">kwds</span></span><span class="sig-paren">)</span><br /> | ||
− | + | : 类型对象的 [[../typeobj#c.PyTypeObject|tp_new]] 槽的通用处理程序。 使用类型的 [[../typeobj#c.PyTypeObject|tp_alloc]] 槽创建一个新实例。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
<dl> | <dl> | ||
− | <dt> | + | <dt><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyType_Ready</span></span></span><span class="sig-paren">(</span>[[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span><span class="sig-paren">)</span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>完成一个类型对象。 这应该在所有类型对象上调用以完成它们的初始化。 该函数负责从类型的基类添加继承的槽。 成功返回 <code>0</code>,或返回 <code>-1</code> 并在错误时设置异常。</p> | |
− | + | <div class="admonition note"> | |
− | + | <p>笔记</p> | |
− | + | <p>如果某些基类实现了 GC 协议,并且提供的类型在其标志中不包含 [[../typeobj#Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_GC]],则 GC 协议将从其父类自动实现。 相反,如果正在创建的类型确实在其标志中包含 [[../typeobj#Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_GC]],那么它 '''必须''' 至少通过实现 [[../typeobj#c.PyTypeObject|tp_traverse]] 句柄来实现 GC 协议本身。</p> | |
+ | |||
+ | </div></dd></dl> | ||
<dl> | <dl> | ||
− | <dt>void *< | + | <dt><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyType_GetSlot</span></span></span><span class="sig-paren">(</span>[[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">slot</span></span><span class="sig-paren">)</span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>返回存储在给定槽中的函数指针。 如果结果是 <code>NULL</code>,这表明插槽是 <code>NULL</code>,或者是使用无效参数调用了该函数。 调用者通常会将结果指针转换为适当的函数类型。</p> | |
− | + | <p>有关 ''slot'' 参数的可能值,请参阅 <code>PyType_Slot.slot</code>。</p> | |
− | + | <p>如果 ''type'' 不是堆类型,则会引发异常。</p> | |
− | |||
− | <p> | ||
− | <p> | ||
<div class="versionadded"> | <div class="versionadded"> | ||
− | <p><span class="versionmodified added">3.4 | + | <p><span class="versionmodified added">3.4 版中的新功能。</span></p> |
</div></dd></dl> | </div></dd></dl> | ||
<dl> | <dl> | ||
− | <dt>[[../structures#c|PyObject]] *< | + | <dt>[[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyType_GetModule</span></span></span><span class="sig-paren">(</span>[[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span><span class="sig-paren">)</span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>当使用 [[#c.PyType_FromModuleAndSpec|PyType_FromModuleAndSpec()]] 创建类型时,返回与给定类型关联的模块对象。</p> | |
− | <p> | + | <p>如果没有模块与给定类型关联,则设置 [[../../library/exceptions#TypeError|TypeError]] 并返回 <code>NULL</code>。</p> |
− | + | <p>该函数通常用于获取定义方法的模块。 请注意,在这种方法中, <code>PyType_GetModule(Py_TYPE(self))</code> 可能不会返回预期的结果。 <code>Py_TYPE(self)</code> 可能是预期类的 ''子类'' ,子类不一定定义在与其超类相同的模块中。 请参阅 [[../structures#c|PyCMethod]] 以获取定义该方法的类。</p> | |
− | <p> | ||
− | |||
− | |||
− | <code>Py_TYPE(self)</code> | ||
− | |||
− | |||
<div class="versionadded"> | <div class="versionadded"> | ||
− | <p><span class="versionmodified added">3.9 | + | <p><span class="versionmodified added">3.9 版中的新功能。</span></p> |
</div></dd></dl> | </div></dd></dl> | ||
<dl> | <dl> | ||
− | <dt>void *< | + | <dt><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyType_GetModuleState</span></span></span><span class="sig-paren">(</span>[[#c.PyTypeObject|<span class="n"><span class="pre">PyTypeObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">type</span></span><span class="sig-paren">)</span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>返回与给定类型关联的模块对象的状态。 这是在 [[#c.PyType_GetModule|PyType_GetModule()]] 的结果上调用 [[../module#c|PyModule_GetState()]] 的快捷方式。</p> | |
− | + | <p>如果没有模块与给定类型关联,则设置 [[../../library/exceptions#TypeError|TypeError]] 并返回 <code>NULL</code>。</p> | |
− | <p> | + | <p>如果 ''type'' 有关联模块,但其状态为 <code>NULL</code>,则返回 <code>NULL</code>,不设置异常。</p> |
− | |||
− | <p> | ||
− | |||
<div class="versionadded"> | <div class="versionadded"> | ||
− | <p><span class="versionmodified added">3.9 | + | <p><span class="versionmodified added">3.9 版中的新功能。</span></p> |
</div></dd></dl> | </div></dd></dl> | ||
第120行: | 第116行: | ||
<div id="creating-heap-allocated-types" class="section"> | <div id="creating-heap-allocated-types" class="section"> | ||
− | == | + | == 创建堆分配类型 == |
− | + | 以下函数和结构用于创建 [[../typeobj#heap-types|堆类型]] 。 | |
− | [[../typeobj#heap-types| | ||
<dl> | <dl> | ||
− | <dt>[[../structures#c|PyObject]] *< | + | <dt>[[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyType_FromModuleAndSpec</span></span></span><span class="sig-paren">(</span>[[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">module</span></span>, [[#c.PyType_Spec|<span class="n"><span class="pre">PyType_Spec</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">spec</span></span>, [[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">bases</span></span><span class="sig-paren">)</span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>从 ''spec'' ([[../typeobj#Py_TPFLAGS_HEAPTYPE|Py_TPFLAGS_HEAPTYPE]]) 创建并返回堆类型对象。</p> | |
− | ([[../typeobj#Py_TPFLAGS_HEAPTYPE| | + | <p>如果 ''bases'' 是元组,则创建的堆类型包含其中包含的所有类型作为基类型。</p> |
− | <p> | + | <p>如果 ''bases'' 是 <code>NULL</code>,则使用 ''Py_tp_bases'' 插槽。 如果这也是 <code>NULL</code>,则使用 ''Py_tp_base'' 插槽。 如果这也是 <code>NULL</code>,则新类型派生自 [[../../library/functions#object|object]]。</p> |
− | + | <p>''module'' 参数可用于记录定义新类的模块。 它必须是一个模块对象或 <code>NULL</code>。 如果不是 <code>NULL</code>,则模块与新类型相关联,稍后可以使用 [[#c.PyType_GetModule|PyType_GetModule()]] 检索。 关联的模块不被子类继承; 必须为每个类单独指定它。</p> | |
− | <p> | + | <p>此函数在新类型上调用 [[#c.PyType_Ready|PyType_Ready()]]。</p> |
− | |||
− | |||
− | <p> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | <p> | ||
<div class="versionadded"> | <div class="versionadded"> | ||
− | <p><span class="versionmodified added">3.9 | + | <p><span class="versionmodified added">3.9 版中的新功能。</span></p> |
</div></dd></dl> | </div></dd></dl> | ||
<dl> | <dl> | ||
− | <dt>[[../structures#c|PyObject]] *< | + | <dt>[[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyType_FromSpecWithBases</span></span></span><span class="sig-paren">(</span>[[#c.PyType_Spec|<span class="n"><span class="pre">PyType_Spec</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">spec</span></span>, [[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">bases</span></span><span class="sig-paren">)</span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>相当于 <code>PyType_FromModuleAndSpec(NULL, spec, bases)</code>。</p> | |
<div class="versionadded"> | <div class="versionadded"> | ||
− | <p><span class="versionmodified added">3.3 | + | <p><span class="versionmodified added">3.3 版中的新功能。</span></p> |
</div></dd></dl> | </div></dd></dl> | ||
− | + | ; [[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyType_FromSpec</span></span></span><span class="sig-paren">(</span>[[#c.PyType_Spec|<span class="n"><span class="pre">PyType_Spec</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">spec</span></span><span class="sig-paren">)</span><br /> | |
− | + | ||
− | < | + | : 相当于 <code>PyType_FromSpecWithBases(spec, NULL)</code>。 |
− | < | ||
<dl> | <dl> | ||
− | <dt> | + | <dt><span class="k"><span class="pre">type</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyType_Spec</span></span></span><br /> |
− | <dd><p> | + | </dt> |
+ | <dd><p>定义类型行为的结构。</p> | ||
<dl> | <dl> | ||
− | <dt> | + | <dt><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-prename descclassname"><span class="n"><span class="pre">PyType_Spec</span></span><span class="p"><span class="pre">.</span></span></span><span class="sig-name descname"><span class="n"><span class="pre">name</span></span></span><br /> |
− | <dd><p> | + | </dt> |
+ | <dd><p>类型名称,用于设置[[../typeobj#c.PyTypeObject|PyTypeObject.tp_name]]。</p></dd></dl> | ||
<dl> | <dl> | ||
− | <dt>int < | + | <dt><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-prename descclassname"><span class="n"><span class="pre">PyType_Spec</span></span><span class="p"><span class="pre">.</span></span></span><span class="sig-name descname"><span class="n"><span class="pre">basicsize</span></span></span><br /> |
+ | </dt> | ||
<dd></dd></dl> | <dd></dd></dl> | ||
<dl> | <dl> | ||
− | <dt>int < | + | <dt><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-prename descclassname"><span class="n"><span class="pre">PyType_Spec</span></span><span class="p"><span class="pre">.</span></span></span><span class="sig-name descname"><span class="n"><span class="pre">itemsize</span></span></span><br /> |
− | <dd><p> | + | </dt> |
− | [[../typeobj#c.PyTypeObject| | + | <dd><p>实例的大小(以字节为单位),用于设置 [[../typeobj#c.PyTypeObject|PyTypeObject.tp_basicsize]] 和 [[../typeobj#c.PyTypeObject|PyTypeObject.tp_itemsize]]。</p></dd></dl> |
− | [[../typeobj#c.PyTypeObject| | ||
<dl> | <dl> | ||
− | <dt>int < | + | <dt><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-prename descclassname"><span class="n"><span class="pre">PyType_Spec</span></span><span class="p"><span class="pre">.</span></span></span><span class="sig-name descname"><span class="n"><span class="pre">flags</span></span></span><br /> |
− | <dd><p> | + | </dt> |
− | <p> | + | <dd><p>类型标志,用于设置[[../typeobj#c.PyTypeObject|PyTypeObject.tp_flags]]。</p> |
− | [[#c.PyType_FromSpecWithBases| | + | <p>如果未设置 <code>Py_TPFLAGS_HEAPTYPE</code> 标志,则 [[#c.PyType_FromSpecWithBases|PyType_FromSpecWithBases()]] 会自动设置它。</p></dd></dl> |
<dl> | <dl> | ||
− | <dt>[[#c.PyType_Slot|PyType_Slot]] *< | + | <dt>[[#c.PyType_Slot|<span class="n"><span class="pre">PyType_Slot</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-prename descclassname"><span class="n"><span class="pre">PyType_Spec</span></span><span class="p"><span class="pre">.</span></span></span><span class="sig-name descname"><span class="n"><span class="pre">slots</span></span></span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>[[#c.PyType_Slot|PyType_Slot]] 结构数组。 由特殊槽值 <code>{0, NULL}</code> 终止。</p></dd></dl> | |
</dd></dl> | </dd></dl> | ||
<dl> | <dl> | ||
− | <dt> | + | <dt><span class="k"><span class="pre">type</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyType_Slot</span></span></span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>定义类型的可选功能的结构,包含插槽 ID 和值指针。</p> | |
<dl> | <dl> | ||
− | <dt>int < | + | <dt><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-prename descclassname"><span class="n"><span class="pre">PyType_Slot</span></span><span class="p"><span class="pre">.</span></span></span><span class="sig-name descname"><span class="n"><span class="pre">slot</span></span></span><br /> |
+ | </dt> | ||
<dd><blockquote><div> | <dd><blockquote><div> | ||
− | <p> | + | <p>插槽 ID。</p> |
− | <p> | + | <p>插槽 ID 的命名类似于结构 [[#c.PyTypeObject|PyTypeObject、]][[../typeobj#c|PyNumberMethods]]、[[../typeobj#c|PySequenceMethods]]、[[../typeobj#c|PyMappingMethods]] 和 [X168syncA]PyMappingMethods[X1653X]PyMappingMethods[X1653X]PyMappingMethods]添加了 <code>Py_</code> 前缀。 例如,使用:</p> |
− | [[#c.PyTypeObject| | ||
− | [[../typeobj#c| | ||
− | [[ | ||
− | |||
<ul> | <ul> | ||
− | <li><p><code>Py_tp_dealloc</code> | + | <li><p><code>Py_tp_dealloc</code> 设置 [[../typeobj#c.PyTypeObject|PyTypeObject.tp_dealloc]]</p></li> |
− | <li><p><code>Py_nb_add</code> | + | <li><p><code>Py_nb_add</code> 设置 [[../typeobj#c.PyNumberMethods|PyNumberMethods.nb_add]]</p></li> |
− | <li><p><code>Py_sq_length</code> | + | <li><p><code>Py_sq_length</code> 设置 [[../typeobj#c.PySequenceMethods|PySequenceMethods.sq_length]]</p></li></ul> |
− | <p> | + | <p>使用 [[#c.PyType_Spec|PyType_Spec]] 和 <code>PyType_Slot</code> 根本无法设置以下字段:</p> |
− | <code>PyType_Slot</code> | ||
<ul> | <ul> | ||
<li><p>[[../typeobj#c.PyTypeObject|<code>tp_dict</code>]]</p></li> | <li><p>[[../typeobj#c.PyTypeObject|<code>tp_dict</code>]]</p></li> | ||
第220行: | 第203行: | ||
<li><p>[[../typeobj#c.PyTypeObject|<code>tp_weaklist</code>]]</p></li> | <li><p>[[../typeobj#c.PyTypeObject|<code>tp_weaklist</code>]]</p></li> | ||
<li><p>[[../typeobj#c.PyTypeObject|<code>tp_vectorcall</code>]]</p></li> | <li><p>[[../typeobj#c.PyTypeObject|<code>tp_vectorcall</code>]]</p></li> | ||
− | <li><p>[[../typeobj#c.PyTypeObject| | + | <li><p>[[../typeobj#c.PyTypeObject|tp_weaklistoffset]](见 [[../structures#pymemberdef-offsets|PyMemberDef]])</p></li> |
− | + | <li><p>[[../typeobj#c.PyTypeObject|tp_dictoffset]](见 [[../structures#pymemberdef-offsets|PyMemberDef]])</p></li> | |
− | <li><p>[[../typeobj#c.PyTypeObject| | + | <li><p>[[../typeobj#c.PyTypeObject|tp_vectorcall_offset]](见 [[../structures#pymemberdef-offsets|PyMemberDef]])</p></li></ul> |
− | |||
− | <li><p>[[../typeobj#c.PyTypeObject| | ||
− | |||
− | <p> | + | <p>受限API下无法使用[[#c.PyType_Spec|PyType_Spec]]和<code>PyType_Slot</code>设置以下字段:</p> |
− | <code>PyType_Slot</code> | ||
<ul> | <ul> | ||
<li><p>[[../typeobj#c.PyBufferProcs|<code>bf_getbuffer</code>]]</p></li> | <li><p>[[../typeobj#c.PyBufferProcs|<code>bf_getbuffer</code>]]</p></li> | ||
<li><p>[[../typeobj#c.PyBufferProcs|<code>bf_releasebuffer</code>]]</p></li></ul> | <li><p>[[../typeobj#c.PyBufferProcs|<code>bf_releasebuffer</code>]]</p></li></ul> | ||
− | <p> | + | <p>在某些平台上设置 <code>Py_tp_bases</code> 或 <code>Py_tp_base</code> 可能会出现问题。 为避免出现问题,请改用 <code>PyType_FromSpecWithBases()</code> 的 ''bases'' 参数。</p> |
− | |||
− | |||
− | <code>PyType_FromSpecWithBases()</code> | ||
</div></blockquote> | </div></blockquote> | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed"> | + | <p><span class="versionmodified changed"> 3.9 版更改: [[../typeobj#c|PyBufferProcs]] 中的 </span> 插槽可以在无限制 API 中设置。</p> |
</div></dd></dl> | </div></dd></dl> | ||
<dl> | <dl> | ||
− | <dt>void *< | + | <dt><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-prename descclassname"><span class="n"><span class="pre">PyType_Slot</span></span><span class="p"><span class="pre">.</span></span></span><span class="sig-name descname"><span class="n"><span class="pre">pfunc</span></span></span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>插槽的所需值。 在大多数情况下,这是一个指向函数的指针。</p> | |
− | <p> | + | <p>可能不是 <code>NULL</code>。</p></dd></dl> |
</dd></dl> | </dd></dl> | ||
</div> | </div> | ||
+ | |||
+ | </div> | ||
+ | <div class="clearer"> | ||
+ | |||
+ | |||
</div> | </div> | ||
− | [[Category:Python 3.9 | + | [[Category:Python 3.9 文档]] |
2021年10月31日 (日) 04:50的最新版本
类型对象
- 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