弱引用物件

Python 支援作為一等物件的弱引用。有兩種特定的物件型別直接實現弱引用。第一種是簡單的引用物件,第二種在儘可能的情況下充當原始物件的代理。

int PyWeakref_Check(PyObject *ob)

如果 ob 是引用物件或代理物件,則返回非零值。此函式總是成功。

int PyWeakref_CheckRef(PyObject *ob)

如果 ob 是引用物件,則返回非零值。此函式總是成功。

int PyWeakref_CheckProxy(PyObject *ob)

如果 ob 是代理物件,則返回非零值。此函式總是成功。

PyObject *PyWeakref_NewRef(PyObject *ob, PyObject *callback)
返回值:新引用。 穩定 ABI 的一部分。

返回物件 ob 的弱引用物件。這將始終返回新的引用,但不保證建立新物件;可能會返回現有的引用物件。第二個引數 callback 可以是可呼叫物件,在 ob 被垃圾回收時接收通知;它應該接受一個引數,即弱引用物件本身。callback 也可以是 NoneNULL。如果 ob 不是可弱引用的物件,或者 callback 不是可呼叫物件、NoneNULL,則會返回 NULL 並引發 TypeError

PyObject *PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
返回值:新引用。 穩定 ABI 的一部分。

返回物件 ob 的弱引用代理物件。這將始終返回新的引用,但不保證建立新物件;可能會返回現有的代理物件。第二個引數 callback 可以是可呼叫物件,在 ob 被垃圾回收時接收通知;它應該接受一個引數,即弱引用物件本身。callback 也可以是 NoneNULL。如果 ob 不是可弱引用的物件,或者 callback 不是可呼叫物件、NoneNULL,則會返回 NULL 並引發 TypeError

int PyWeakref_GetRef(PyObject *ref, PyObject **pobj)
自版本 3.13 起為 穩定 ABI 的一部分。

從弱引用 ref 獲取對被引用物件的強引用,放入 *pobj 中。

  • 成功時,將 *pobj 設定為指向被引用物件的新的 強引用,並返回 1。

  • 如果引用已死,則將 *pobj 設定為 NULL 並返回 0。

  • 發生錯誤時,引發異常並返回 -1。

在版本 3.13 中新增。

PyObject *PyWeakref_GetObject(PyObject *ref)
返回值:借用引用。 穩定 ABI 的一部分。

從弱引用 ref 返回對被引用物件的借用引用。如果被引用物件不再有效,則返回 Py_None

註釋

此函式返回對被引用物件的借用引用。這意味著您應該始終對物件呼叫 Py_INCREF(),除非在借用引用的最後一次使用之前它不能被銷燬。

自版本 3.13 起已棄用,將在版本 3.15 中刪除: 請改用 PyWeakref_GetRef()

PyObject *PyWeakref_GET_OBJECT(PyObject *ref)
返回值:借用引用。

類似於 PyWeakref_GetObject(),但不進行錯誤檢查。

自版本 3.13 起已棄用,將在版本 3.15 中刪除: 請改用 PyWeakref_GetRef()

void PyObject_ClearWeakRefs(PyObject *object)
屬於 穩定 ABI 的一部分。

此函式由 tp_dealloc 處理程式呼叫以清除弱引用。

此函式遍歷 object 的弱引用,併為那些具有回撥函式的弱引用呼叫回撥函式。當所有回撥函式嘗試呼叫完畢後,函式返回。

void PyUnstable_Object_ClearWeakRefsNoCallbacks(PyObject *object)
這是一個不穩定的 API。它可能會在次要版本中更改,恕不另行通知。

清除 object 的弱引用,但不呼叫回撥函式。

此函式由具有終結器的型別(即,__del__())的 tp_dealloc 處理程式呼叫。這些物件的處理程式首先呼叫 PyObject_ClearWeakRefs() 來清除弱引用並呼叫它們的回撥函式,然後呼叫終結器,最後呼叫此函式來清除終結器可能建立的任何弱引用。

在大多數情況下,使用 PyObject_ClearWeakRefs() 清除弱引用比使用此函式更合適。

在版本 3.13 中新增。