国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

Python:__weakref__ 詳解

0
分享至

在 Python 的對象模型中,變量的“賦值”本質(zhì)上是引用綁定(binding)。只要存在至少一個強引用指向某個對象,該對象就不會被垃圾回收。然而,有些場景中我們需要“觀察對象是否還存在”,又不希望阻止其被回收,這時就需要弱引用(Weak Reference)。__weakref__ 正是弱引用機制在對象內(nèi)部的核心載體。

一、__weakref__ 是什么?

__weakref__ 是 Python 對象中的一個內(nèi)置屬性,用于存儲該對象被弱引用(weakref 模塊)追蹤的信息。它通常由 Python 自動管理,用戶無需直接操作,但理解它有助于掌握弱引用的底層原理。

核心功能:

? 存儲指向該對象的所有弱引用(weakref.ref、weakref.proxy 等)。

? 當(dāng)對象支持弱引用時,Python 會自動為其實例生成此屬性。

? 若類使用 __slots__ 禁止了動態(tài)屬性,必須顯式聲明 __weakref__ 才能支持弱引用。

語法:

object.__weakref__

示例:

print(d.__weakref__)  # 輸出:

在 CPython 中,每個對象都有一個引用計數(shù)(Reference Count),當(dāng)引用計數(shù)歸零時,對象會被垃圾回收(GC),這種方式又稱為“強引用”。

del b           # 引用計數(shù)為 0,對象被銷毀

弱引用不會增加對象的引用計數(shù),因此不會阻止對象被回收。

print(w())           # 輸出:None(對象已被回收,弱引用失效)

二、weakref 模塊的使用

Python 提供了 weakref 標(biāo)準(zhǔn)庫來管理弱引用。

weakref.ref(obj):創(chuàng)建弱引用對象。

weakref.proxy(obj):創(chuàng)建自動解引用的代理。

weakref.WeakKeyDictionary:鍵為弱引用的字典。

weakref.WeakValueDictionary:值為弱引用的字典。

當(dāng)我們通過 weakref.ref(obj) 創(chuàng)建弱引用時,Python 會將弱引用對象登記在目標(biāo)對象的 __weakref__ 屬性中。因此,__weakref__ 可以理解為:對象內(nèi)部用于記錄所有弱引用它的“登記表”。

三、__weakref__ 與 __slots__ 的關(guān)系

如果類定義了 __slots__,默認情況下不會自動創(chuàng)建 __weakref__ 屬性,從而導(dǎo)致實例不支持弱引用。

錯誤示例:

    # 輸出:cannot create weak reference to 'A' object

正確示例:

print(w)  # 正常輸出

若類定義了 __slots__ 且需支持弱引用,必須將 "__weakref__" 顯式包含在 __slots__ 列表中。

四、弱引用的典型應(yīng)用場景

(1)緩存與對象池

適用于圖像、模型、數(shù)據(jù)庫連接等資源,希望緩存對象但又不阻止其回收。

print(list(_cache.keys()))   # [] 緩存自動清除

(2)打破循環(huán)引用

弱引用常用于解決對象間的循環(huán)依賴問題。

問題代碼(循環(huán)引用):

child.parent = root  # 互相強引用,形成循環(huán)

改進代碼(使用弱引用):

root.children.append(child)  # root 強引用 child (單向)

(3)GUI、事件系統(tǒng)與觀察者模式

在 GUI 框架或事件系統(tǒng)中,常用弱引用來注冊回調(diào)函數(shù),避免因回調(diào)持有對象引用而導(dǎo)致控件無法釋放。

五、生命周期與內(nèi)存管理

弱引用的價值在于:允許觀察對象存活狀態(tài),而不擁有對象。

生命周期主要分為三個階段。

(1)創(chuàng)建階段

首次對對象創(chuàng)建弱引用時:

? Python 為對象建立內(nèi)部弱引用鏈表(__weakref__)

? 弱引用對象加入鏈表

? 不增加引用計數(shù)

w = weakref.ref(obj)  # obj 的引用計數(shù)不變

(2)存活階段(對象仍存在)

? 調(diào)用 w() 返回原對象

? 對象正常使用,不受弱引用影響

? 弱引用不會阻止對象被垃圾回收

示例:

    t.do_something()

(3)銷毀階段(對象被回收)

當(dāng)對象被 GC 回收時:

? 所有弱引用失效

? 回調(diào)(如果有)被調(diào)用

? w() 永遠返回 None

print(w())    # None

如果使用 proxy:

p = weakref.proxy(A())

對象消失后:

# ReferenceError: weakly-referenced object no longer exists

proxy 的安全性不如 ref,需要注意。

六、常見誤區(qū)與注意事項

(1)并非所有類型都支持弱引用

內(nèi)置類型(int, str, tuple, list 等)通常不支持。

print(hasattr(x, "__weakref__"))  # False,內(nèi)置類型 int 不支持弱引用

僅用戶自定義類或特定擴展類型支持弱引用。

(2)弱引用不會延長對象壽命

弱引用只觀察對象,不影響引用計數(shù)。

(3)使用弱引用要檢查有效性

若對象被銷毀后仍使用弱引用結(jié)果,會得到 None,需始終檢查返回值有效性。

小結(jié)

__weakref__ 是 Python 對象系統(tǒng)中一個低調(diào)卻至關(guān)重要的機制。它使得我們可以在不干擾對象生命周期的前提下,安全地追蹤、緩存或引用對象——這對于內(nèi)存優(yōu)化、循環(huán)引用處理、事件系統(tǒng)都有深遠意義。


點贊有美意,贊賞是鼓勵

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點推薦
廣東108-78遼籃!球員評分:3人滿分,3人良好,1人不合格

廣東108-78遼籃!球員評分:3人滿分,3人良好,1人不合格

多特體育說
2026-01-11 21:39:19
蔬菜市場遇冷,這3種菜便宜卻沒人買,攤販:現(xiàn)在老百姓太精明了

蔬菜市場遇冷,這3種菜便宜卻沒人買,攤販:現(xiàn)在老百姓太精明了

三農(nóng)雷哥
2026-01-11 17:28:07
萬萬沒想到!李晨會因為老人味登上熱搜,感覺他這輩子很難結(jié)婚了

萬萬沒想到!李晨會因為老人味登上熱搜,感覺他這輩子很難結(jié)婚了

樂悠悠娛樂
2025-12-02 11:01:18
打平就出線!U23國足成亞洲杯大黑馬:賽后澳大利亞球員低下頭顱

打平就出線!U23國足成亞洲杯大黑馬:賽后澳大利亞球員低下頭顱

足球大腕
2026-01-11 22:02:43
羽壇名將李宗偉:36歲患癌喉嚨全爛,花近1000萬續(xù)命,現(xiàn)狀如何?

羽壇名將李宗偉:36歲患癌喉嚨全爛,花近1000萬續(xù)命,現(xiàn)狀如何?

豐譚筆錄
2026-01-07 10:59:38
遼寧78-108廣東1喜3憂!小將罕見暴走,姜宇星仍崩,2將難打強隊

遼寧78-108廣東1喜3憂!小將罕見暴走,姜宇星仍崩,2將難打強隊

籃球資訊達人
2026-01-11 22:32:21
2026年春節(jié),要暖到離譜?大年初一撞上七九,老輩人:60年頭回見

2026年春節(jié),要暖到離譜?大年初一撞上七九,老輩人:60年頭回見

叮當(dāng)當(dāng)科技
2026-01-07 13:58:49
愛奇藝、騰訊、優(yōu)酷三大平臺“王炸劇”紛紛登場,誰能登頂劇王?

愛奇藝、騰訊、優(yōu)酷三大平臺“王炸劇”紛紛登場,誰能登頂劇王?

鄉(xiāng)野小珥
2026-01-12 05:57:22
乒球世界排名更新:朱雨玲第5獲28萬,陳幸同重返第3

乒球世界排名更新:朱雨玲第5獲28萬,陳幸同重返第3

民哥臺球解說
2026-01-12 05:20:12
氧氣要火了?科學(xué)家發(fā)現(xiàn)寶藏:吸100%純氧3個月,生理倒拔20歲

氧氣要火了?科學(xué)家發(fā)現(xiàn)寶藏:吸100%純氧3個月,生理倒拔20歲

科學(xué)認識論
2026-01-11 17:13:05
開國大將次子羅宇,89年攜香港女星叛逃出國,晚年在美國黯然離世

開國大將次子羅宇,89年攜香港女星叛逃出國,晚年在美國黯然離世

搜史君
2025-12-31 13:00:10
形勢突變!別了,北約!美國這次玩真的!

形勢突變!別了,北約!美國這次玩真的!

李榮茂
2026-01-12 07:03:16
哈梅內(nèi)伊開始大范圍斷網(wǎng),革命衛(wèi)隊將與中俄軍演,伊朗進入關(guān)鍵期

哈梅內(nèi)伊開始大范圍斷網(wǎng),革命衛(wèi)隊將與中俄軍演,伊朗進入關(guān)鍵期

溫讀史
2026-01-10 07:33:53
拉菲尼亞雙響鎖定勝局,巴薩3-2皇馬衛(wèi)冕西超杯

拉菲尼亞雙響鎖定勝局,巴薩3-2皇馬衛(wèi)冕西超杯

浮萍足球
2026-01-12 07:24:06
廣西又有2名干部向紀(jì)委投案自首!

廣西又有2名干部向紀(jì)委投案自首!

嶺南美玉
2026-01-12 00:08:15
我只認出了萬梓良 ,你們呢 ?

我只認出了萬梓良 ,你們呢 ?

小椰的奶奶
2026-01-12 01:45:27
為保護馬杜羅夫妻戰(zhàn)死的古巴桑切斯上校,被曝光家人都住在美國!

為保護馬杜羅夫妻戰(zhàn)死的古巴桑切斯上校,被曝光家人都住在美國!

阿龍聊軍事
2026-01-09 20:20:47
伊朗政府宣布全國哀悼三天

伊朗政府宣布全國哀悼三天

界面新聞
2026-01-12 07:03:21
沒想到竟然這么多工作需要保密的!網(wǎng)友:不讓看非看被一槍斃了

沒想到竟然這么多工作需要保密的!網(wǎng)友:不讓看非看被一槍斃了

另子維愛讀史
2025-12-08 20:58:22
汪小菲為什么發(fā)瘋,發(fā)瘋背后是流量斷崖式的下跌

汪小菲為什么發(fā)瘋,發(fā)瘋背后是流量斷崖式的下跌

調(diào)侃國際觀點
2026-01-11 18:41:24
2026-01-12 08:04:49
MediaTea
MediaTea
專業(yè)的數(shù)字媒體、新媒體技術(shù)
1701文章數(shù) 72關(guān)注度
往期回顧 全部

科技要聞

“我們與美國的差距也許還在拉大”

頭條要聞

李獻林學(xué)習(xí)教育期間違規(guī)吃喝:5人喝4瓶酒 1人酒后死亡

頭條要聞

李獻林學(xué)習(xí)教育期間違規(guī)吃喝:5人喝4瓶酒 1人酒后死亡

體育要聞

U23國足形勢:末輪不負泰國即確保晉級

娛樂要聞

留幾手為閆學(xué)晶叫屈?稱網(wǎng)友自卑敏感

財經(jīng)要聞

外賣平臺"燒錢搶存量市場"迎來終局?

汽車要聞

2026款宋Pro DM-i長續(xù)航補貼后9.98萬起

態(tài)度原創(chuàng)

親子
旅游
教育
家居
公開課

親子要聞

最近的孩子怎么都長得這么著急?你不說,誰知道他還是個寶寶?

旅游要聞

生態(tài)優(yōu)先,雪域高原煥發(fā)新生機(子夜走筆)

教育要聞

1分鐘說清!山西工程科技職業(yè)大學(xué)專業(yè)錄取線

家居要聞

木色留白 演繹現(xiàn)代自由

公開課

李玫瑾:為什么性格比能力更重要?

無障礙瀏覽 進入關(guān)懷版