型別物件¶
-
PyTypeObject PyType_Type¶
- 屬於穩定 ABI 的一部分。
這是型別物件的型別物件;它與 Python 層中的
type
物件相同。
-
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
的替代方案。返回的字典必須被視為只讀。此函式用於特定的嵌入和語言繫結情況,在這種情況下,直接訪問 dict 是必要的,而間接訪問 (例如透過代理或
PyObject_GetAttr()
) 是不夠的。擴充套件模組在設定自己的型別時應繼續直接或間接地使用
tp_dict
。在 3.12 版本中加入。
-
void PyType_Modified(PyTypeObject *type)¶
- 屬於穩定 ABI 的一部分。
使型別及其所有子型別的內部查詢快取無效。在手動修改型別的屬性或基類之後,必須呼叫此函式。
-
int PyType_AddWatcher(PyType_WatchCallback callback)¶
將 *callback* 註冊為型別監視器。返回一個非負整數 ID,該 ID 必須傳遞給將來對
PyType_Watch()
的呼叫。如果發生錯誤 (例如,沒有更多可用的監視器 ID),則返回-1
並設定一個異常。在 3.12 版本中加入。
-
int PyType_ClearWatcher(int watcher_id)¶
清除由 *watcher_id* 標識的監視器 (先前從
PyType_AddWatcher()
返回)。成功返回0
,錯誤返回-1
(例如,如果從未註冊 *watcher_id* )。擴充套件不應使用未透過先前呼叫
PyType_AddWatcher()
返回給它的 *watcher_id* 呼叫PyType_ClearWatcher
。在 3.12 版本中加入。
-
int PyType_Watch(int watcher_id, PyObject *type)¶
將 *type* 標記為已監視。每當
PyType_Modified()
報告對 *type* 的更改時,將呼叫由PyType_AddWatcher()
授予 *watcher_id* 的回撥。(如果_PyType_Lookup()
在對 *type* 的一系列連續修改之間未在 *type* 上呼叫,則回撥可能只被呼叫一次;這是一個實現細節,可能會發生變化。)擴充套件不應使用未透過先前呼叫
PyType_AddWatcher()
返回給它的 *watcher_id* 呼叫PyType_Watch
。在 3.12 版本中加入。
-
typedef int (*PyType_WatchCallback)(PyObject *type)¶
型別監視器回撥函式的型別。
回撥不得修改 *type* 或導致對 *type* 或其 MRO 中的任何型別呼叫
PyType_Modified()
;違反此規則可能會導致無限遞迴。在 3.12 版本中加入。
-
int PyType_HasFeature(PyTypeObject *o, int feature)¶
如果型別物件 *o* 設定了特性 *feature*,則返回非零值。型別特性由單位元標誌表示。
-
int PyType_IS_GC(PyTypeObject *o)¶
如果型別物件包含對迴圈檢測器的支援,則返回 true;這將測試型別標誌
Py_TPFLAGS_HAVE_GC
。
-
int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)¶
- 屬於穩定 ABI 的一部分。
如果 *a* 是 *b* 的子型別,則返回 true。
此函式僅檢查實際的子型別,這意味著不會在 *b* 上呼叫
__subclasscheck__()
。呼叫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 的一部分。
-
int PyType_Ready(PyTypeObject *type)¶
- 屬於穩定 ABI 的一部分。
完成型別物件。應該在所有型別物件上呼叫此函式以完成它們的初始化。此函式負責從型別的基類新增繼承的槽。成功時返回
0
,失敗時返回-1
並設定一個異常。注意
如果某些基類實現了 GC 協議,並且提供的型別在其標誌中不包含
Py_TPFLAGS_HAVE_GC
,那麼將自動從其父類實現 GC 協議。相反,如果正在建立的型別在其標誌中包含Py_TPFLAGS_HAVE_GC
,那麼它必須透過至少實現tp_traverse
處理程式來實現 GC 協議本身。
-
PyObject *PyType_GetName(PyTypeObject *type)¶
- 返回值:新引用。 自 3.11 版本起,屬於 穩定 ABI 的一部分。
返回型別的名稱。等效於獲取型別的
__name__
屬性。3.11 版本新增。
-
PyObject *PyType_GetQualName(PyTypeObject *type)¶
- 返回值:新引用。 自 3.11 版本起,屬於 穩定 ABI 的一部分。
返回型別的限定名稱。等效於獲取型別的
__qualname__
屬性。3.11 版本新增。
-
PyObject *PyType_GetFullyQualifiedName(PyTypeObject *type)¶
- 自 3.13 版本起,屬於 穩定 ABI 的一部分。
返回型別的完全限定名稱。等效於
f"{type.__module__}.{type.__qualname__}"
,如果type.__module__
不是字串或等於"builtins"
,則等效於type.__qualname__
。3.13 版本新增。
-
PyObject *PyType_GetModuleName(PyTypeObject *type)¶
- 自 3.13 版本起,屬於 穩定 ABI 的一部分。
返回型別的模組名稱。等效於獲取
type.__module__
屬性。3.13 版本新增。
-
void *PyType_GetSlot(PyTypeObject *type, int slot)¶
- 自 3.4 版本起,屬於 穩定 ABI 的一部分。
返回儲存在給定插槽中的函式指標。如果結果為
NULL
,則表示該插槽為NULL
,或者該函式被呼叫時使用了無效的引數。呼叫者通常會將結果指標強制轉換為適當的函式型別。有關 *slot* 引數的可能值,請參閱
PyType_Slot.slot
。3.4 版本新增。
在 3.10 版本中更改:
PyType_GetSlot()
現在可以接受所有型別。以前,它僅限於 堆型別。
-
PyObject *PyType_GetModule(PyTypeObject *type)¶
- 自 3.10 版本起,屬於 穩定 ABI 的一部分。
當型別使用
PyType_FromModuleAndSpec()
建立時,返回與給定型別關聯的模組物件。如果給定型別沒有關聯的模組,則設定
TypeError
並返回NULL
。此函式通常用於獲取定義方法的模組。請注意,在此類方法中,
PyType_GetModule(Py_TYPE(self))
可能不會返回預期結果。Py_TYPE(self)
可能是預期類的子類,而子類不一定與其超類定義在同一模組中。請參閱PyCMethod
以獲取定義該方法的類。對於無法使用PyCMethod
的情況,請參閱PyType_GetModuleByDef()
。3.9 版本中新增。
-
void *PyType_GetModuleState(PyTypeObject *type)¶
- 自 3.10 版本起,屬於 穩定 ABI 的一部分。
返回與給定型別關聯的模組物件的狀態。這是在
PyType_GetModule()
的結果上呼叫PyModule_GetState()
的快捷方式。如果給定型別沒有關聯的模組,則設定
TypeError
並返回NULL
。如果 type 有關聯的模組,但其狀態為
NULL
,則返回NULL
,而不會設定異常。3.9 版本中新增。
-
PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)¶
- 自 3.13 版本起,屬於 穩定 ABI 的一部分。
查詢其模組是使用給定的
PyModuleDef
def 建立的第一個超類,並返回該模組。如果未找到模組,則會引發
TypeError
並返回NULL
。此函式旨在與
PyModule_GetState()
一起使用,以從槽方法(例如tp_init
或nb_add
)和其他無法使用PyCMethod
呼叫約定傳遞方法定義類的地方獲取模組狀態。3.11 版本新增。
-
int PyUnstable_Type_AssignVersionTag(PyTypeObject *type)¶
- 這是 不穩定 API。它可能會在次要版本中更改,恕不另行通知。
嘗試為給定型別分配版本標籤。
如果型別已經具有有效的版本標籤或已分配新標籤,則返回 1;如果無法分配新標籤,則返回 0。
在 3.12 版本中加入。
建立堆分配型別¶
以下函式和結構用於建立 堆型別。
-
PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)¶
- 自 3.12 版本以來是 穩定 ABI 的一部分。
從 spec 建立並返回一個 堆型別(請參閱
Py_TPFLAGS_HEAPTYPE
)。元類 metaclass 用於構造生成的型別物件。當 metaclass 為
NULL
時,元類從 bases 派生(如果 bases 為NULL
,則從 Py_tp_base[s] 槽派生,見下文)。不支援重寫
tp_new
的元類,除非tp_new
為NULL
。(為了向後相容,其他PyType_From*
函式允許使用此類元類。它們會忽略tp_new
,這可能會導致初始化不完整。這已被棄用,在 Python 3.14+ 中將不再支援此類元類。)bases 引數可用於指定基類;它可以只是一個類或一個類元組。如果 bases 為
NULL
,則使用 Py_tp_bases 槽。如果該槽也為NULL
,則使用 Py_tp_base 槽。如果該槽也為NULL
,則新型別從object
派生。module 引數可用於記錄新類定義的模組。它必須是模組物件或
NULL
。如果不是NULL
,則該模組與新型別關聯,並且稍後可以使用PyType_GetModule()
檢索。關聯的模組不會被子類繼承;它必須為每個類單獨指定。此函式在新型別上呼叫
PyType_Ready()
。請注意,此函式不完全匹配呼叫
type()
或使用class
語句的行為。對於使用者提供的基型別或元類,請優先 呼叫type
(或元類)而不是PyType_From*
函式。具體來說__new__()
不會在新類上呼叫(並且必須設定為type.__new__
)。__init__()
不會在新類上呼叫。__init_subclass__()
不會在任何基類上呼叫。__set_name__()
不會在新的描述符上呼叫。
在 3.12 版本中加入。
-
PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)¶
- 返回值:新引用。自 3.10 版本以來是 穩定 ABI 的一部分。
等效於
PyType_FromMetaclass(NULL, module, spec, bases)
。3.9 版本中新增。
在 3.10 版本中更改:該函式現在接受單個類作為 bases 引數,並接受
NULL
作為tp_doc
槽。
-
PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)¶
- 返回值:新引用。自 3.3 版本以來,屬於穩定 ABI 的一部分。
等價於
PyType_FromMetaclass(NULL, NULL, spec, bases)
。在 3.3 版本中新增。
-
PyObject *PyType_FromSpec(PyType_Spec *spec)¶
- 返回值:新引用。 屬於 穩定 ABI 的一部分。
等價於
PyType_FromMetaclass(NULL, NULL, spec, NULL)
。
-
type PyType_Spec¶
- 屬於穩定 ABI 的一部分(包括所有成員)。
定義型別的行為的結構。
-
const char *name¶
型別的名稱,用於設定
PyTypeObject.tp_name
。
-
int basicsize¶
如果為正數,則指定例項的大小(以位元組為單位)。它用於設定
PyTypeObject.tp_basicsize
。如果為零,則指定應繼承
tp_basicsize
。如果為負數,則絕對值指定該類例項除了超類之外還需要多少空間。使用
PyObject_GetTypeData()
獲取指向以此方式保留的子類特定記憶體的指標。3.12 版本更改: 之前,此欄位不能為負數。
-
int itemsize¶
可變大小型別的一個元素的大小(以位元組為單位)。用於設定
PyTypeObject.tp_itemsize
。請參閱tp_itemsize
文件瞭解注意事項。如果為零,則繼承
tp_itemsize
。擴充套件任意可變大小的類是危險的,因為某些型別對可變大小的記憶體使用固定偏移量,這可能會與子類使用的固定大小的記憶體重疊。為了幫助防止錯誤,僅在以下情況下才能繼承itemsize
基類不是可變大小的(其
tp_itemsize
)。請求的
PyType_Spec.basicsize
為正數,表明基類的記憶體佈局是已知的。請求的
PyType_Spec.basicsize
為零,表明子類不直接訪問例項的記憶體。使用
Py_TPFLAGS_ITEMS_AT_END
標誌。
-
unsigned int flags¶
型別標誌,用於設定
PyTypeObject.tp_flags
。如果未設定
Py_TPFLAGS_HEAPTYPE
標誌,則PyType_FromSpecWithBases()
會自動設定該標誌。
-
PyType_Slot *slots¶
PyType_Slot
結構的陣列。以特殊槽值{0, NULL}
終止。每個槽 ID 最多應指定一次。
-
const char *name¶
-
type PyType_Slot¶
- 屬於穩定 ABI 的一部分(包括所有成員)。
定義型別的可選功能的結構,包含一個槽 ID 和一個值指標。
-
int slot¶
一個槽 ID。
槽 ID 的命名類似於
PyTypeObject
、PyNumberMethods
、PySequenceMethods
、PyMappingMethods
和PyAsyncMethods
結構的欄位名稱,並添加了Py_
字首。例如,使用Py_tp_dealloc
設定PyTypeObject.tp_dealloc
Py_nb_add
設定PyNumberMethods.nb_add
Py_sq_length
設定PySequenceMethods.sq_length
以下“offset”欄位不能使用
PyType_Slot
設定tp_weaklistoffset
(如果可能,請改用Py_TPFLAGS_MANAGED_WEAKREF
)tp_dictoffset
(如果可能,請改用Py_TPFLAGS_MANAGED_DICT
)tp_vectorcall_offset
(在 PyMemberDef 中使用"__vectorcalloffset__"
)
如果無法切換到
MANAGED
標誌(例如,對於 vectorcall 或為了支援低於 3.12 的 Python 版本),請在Py_tp_members
中指定偏移量。有關詳細資訊,請參閱 PyMemberDef 文件。在建立堆型別時,以下欄位完全不能設定
tp_vectorcall
(請使用tp_new
和/或tp_init
)內部欄位:
tp_dict
,tp_mro
,tp_cache
,tp_subclasses
, 和tp_weaklist
。
在某些平臺上,設定
Py_tp_bases
或Py_tp_base
可能會有問題。為了避免問題,請使用PyType_FromSpecWithBases()
的 bases 引數來代替。3.9 版本變更:
PyBufferProcs
中的槽位可以在無限制 API 中設定。3.11 版本變更:
bf_getbuffer
和bf_releasebuffer
現在可以在 有限 API 下使用。
-
void *pfunc¶
槽位的期望值。在大多數情況下,這是一個指向函式的指標。
除了
Py_tp_doc
之外的槽位不能為NULL
。
-
int slot¶