弱引用物件¶
Python 支援將弱引用作為一級物件。有兩種特定的物件型別直接實現弱引用。第一種是簡單的引用物件,第二種則儘可能地充當原始物件的代理。
-
PyObject *PyWeakref_NewRef(PyObject *ob, PyObject *callback)¶
- 返回值: 新引用。 穩定ABI 的一部分。
返回物件 ob 的弱引用物件。這將總是返回一個新的引用,但不能保證建立一個新的物件;可能會返回一個現有引用物件。第二個引數 callback 可以是一個可呼叫物件,當 ob 被垃圾回收時會收到通知;它應該接受一個引數,該引數將是弱引用物件本身。callback 也可以是
None
或NULL
。如果 ob 不是一個可弱引用的物件,或者如果 callback 不可呼叫,None
或NULL
,此函式將返回NULL
並引發TypeError
。
-
PyObject *PyWeakref_NewProxy(PyObject *ob, PyObject *callback)¶
- 返回值: 新引用。 穩定ABI 的一部分。
返回物件 ob 的弱引用代理物件。這將總是返回一個新的引用,但不能保證建立一個新的物件;可能會返回一個現有代理物件。第二個引數 callback 可以是一個可呼叫物件,當 ob 被垃圾回收時會收到通知;它應該接受一個引數,該引數將是弱引用物件本身。callback 也可以是
None
或NULL
。如果 ob 不是一個可弱引用的物件,或者如果 callback 不可呼叫,None
或NULL
,此函式將返回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()
。
-
int PyWeakref_IsDead(PyObject *ref)¶
測試弱引用 ref 是否失效。如果引用失效,返回 1;如果引用有效,返回 0;如果 ref 不是弱引用物件,則返回 -1 並設定錯誤。
在 3.14 版本加入。
-
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 版本加入。