Python?中的對(duì)象析構(gòu)函數(shù)__del__?詳情
前言:
Python 中的類的構(gòu)造函數(shù) ??__init__?? , 每當(dāng)實(shí)例產(chǎn)生就會(huì)調(diào)用這個(gè)構(gòu)造函數(shù)。
反過來,每當(dāng)實(shí)例對(duì)象需要被垃圾收集被收回時(shí),就需要用到析構(gòu)函數(shù) ??__del__?? 。
??__del__?? 方法是類的一種特殊方法??梢岳???__del__?? 方法來清理資源,例如關(guān)閉文件。
來看一個(gè)例子:
class Life: ? ? def __init__(self, name='None'): ? ? ? ? print('Hello,' + name) ? ? ? ? self.name = name ? ? def live(self): ? ? ? ? print(self.name) ? ?? ? ? def __del__(self): ? ? ? ? print("Goodbye," + self.name) def main(): ? ? bob = Life('Bob') ? ? bob.live() if __name__ == '__main__': ? ? main()
運(yùn)行該代碼,輸出結(jié)果為:
Hello,Bob
Bob
Goodbye,Bob
我們得到上面的輸出是因?yàn)楫?dāng)代碼即將結(jié)束時(shí),不再需要類 Life,因此它已準(zhǔn)備好被銷毀。 在類 Life 被銷毀之前,會(huì)自動(dòng)調(diào)用 ??__del__?? 方法。
還可以通過調(diào)用 ??del?? 手動(dòng)調(diào)用 ??__del__?? 方法:
class Life: ? ? def __init__(self, name='None'): ? ? ? ? print('Hello,' + name) ? ? ? ? self.name = name ? ? def live(self): ? ? ? ? print(self.name) ? ?? ? ? def __del__(self): ? ? ? ? print("Goodbye," + self.name) def main(): ? ? bob = Life('Bob') ? ? del bob if __name__ == '__main__': ? ? main()
執(zhí)行結(jié)果:
Hello,Bob
Goodbye,Bob
值得注意的是:??del x?? 并不直接調(diào)用 ??x.__del__()?? ,前者將 x 的引用計(jì)數(shù)減一,而后者僅在其引用計(jì)數(shù)達(dá)到零時(shí)才被調(diào)用。
在 Python 中,任何未使用的對(duì)象(如內(nèi)置類型或類的實(shí)例)在不再使用時(shí)會(huì)自動(dòng)從內(nèi)存中刪除(移除)。 這種釋放和回收未使用內(nèi)存空間的過程稱為垃圾回收。
在Python中何時(shí)使用__del__?
重要的是要注意,當(dāng)對(duì)象處于銷毀的過程中,調(diào)用 ??__del__?? 方法(未損壞后),因此仍然可以在__del__方法中訪問屬性。
由于??__del__??
可以訪問對(duì)象的數(shù)據(jù)成員,因此應(yīng)該確保對(duì)象的填充刪除,以便沒有內(nèi)存泄露。
class App: ? ? def __init__(self): ? ? ? ? print("Open App") ? ? def __del__(self): ? ? ? ? print("Closed App") class Phone: ? ? app = None ? ? def __init__(self): ? ? ? ? print("Switching on the Phone") ? ? ? ? self.__class__.app = App() ? ? def __del__(self): ? ? ? ? del self.__class__.app ? ? ? ? print("Switching off the Phone") phone = Phone() del phone
執(zhí)行結(jié)果:
Switching on the Phone
Open App
Closed App
Switching off the Phone
在這個(gè)例子中,如果我們沒有在??__del__??
方法中銷毀手機(jī)的屬性 app,它就會(huì)留在內(nèi)存中,導(dǎo)致內(nèi)存泄漏。
析構(gòu)函數(shù)使用緊要
Python 中的析構(gòu)函數(shù)并不像 C++ 中那樣被頻繁使用,因?yàn)樗嬖谝恍┍娝苤木婧蜆O少數(shù)鮮為人知的暗坑。
盡量減少使用 ??__del__?? 函數(shù):
- 第一,因?yàn)?Python 在回收實(shí)例時(shí),會(huì)自動(dòng)回收該實(shí)例擁有的所有內(nèi)存空間,所以析構(gòu)函數(shù)并不需要考慮空間管理。所以也就失去了手動(dòng)寫 ??
__del__??
的意義。 - 第二,無法預(yù)測(cè)一個(gè)實(shí)例什么時(shí)候會(huì)被回收。有時(shí)候你想觸發(fā)析構(gòu)函數(shù)時(shí),系統(tǒng)表中對(duì)對(duì)象的引用會(huì)阻止析構(gòu)函數(shù)的執(zhí)行。Python 也無法保證解釋器退出時(shí),一個(gè)仍然存在的對(duì)象會(huì)調(diào)用其析構(gòu)函數(shù)。
- 第三,??__del__?? 可能會(huì)引發(fā)的異常會(huì)直接向
sys.stderr
(標(biāo)準(zhǔn)錯(cuò)誤流) 打印一條警告消息,而不是觸發(fā)一個(gè)異常事件。因?yàn)樗ㄟ^垃圾收集器運(yùn)行在不可預(yù)料的上下文中。 - 第四,當(dāng)我們期待垃圾回收時(shí),對(duì)象間的循環(huán)引用可能會(huì)阻止其發(fā)生。
總結(jié):
- 當(dāng)對(duì)象被銷毀時(shí),Python 會(huì)自動(dòng)調(diào)用對(duì)象上的 ??__del__?? 方法(??類似于在對(duì)象創(chuàng)建期間調(diào)用的 ??__init__?? 構(gòu)造函數(shù))。
- ??__del__?? 方法類似于 C++ 和 Java 中的析構(gòu)函數(shù)。用于銷毀對(duì)象的狀態(tài)。
- Python 中,盡量減少析構(gòu)函數(shù)的使用。
到此這篇關(guān)于Python 中的對(duì)象析構(gòu)函數(shù)__del__ 詳情的文章就介紹到這了,更多相關(guān)Python 對(duì)象析構(gòu)函數(shù)del內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python讀取大型數(shù)據(jù)文件的6種方式匯總
在 Python 中,我們可以使用多種方法讀取大型數(shù)據(jù)文件,本文主要為大家介紹6個(gè)常用的Python讀取大型數(shù)據(jù)文件的方法,希望對(duì)大家有所幫助2023-05-05Python列表list解析操作示例【整數(shù)操作、字符操作、矩陣操作】
這篇文章主要介紹了Python列表list解析操作,結(jié)合實(shí)例形式分析了Python列表針對(duì)整數(shù)、字符及矩陣的解析操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07pytorch之深度神經(jīng)網(wǎng)絡(luò)概念全面整理
這篇文章主要介紹了pytorch之深度神經(jīng)網(wǎng)絡(luò)概念,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Python+selenium破解拼圖驗(yàn)證碼的腳本
很多網(wǎng)站在登錄或者注冊(cè)時(shí)都會(huì)遇到拼圖驗(yàn)證碼,這種拼圖驗(yàn)證碼實(shí)際上是多個(gè)小碎片經(jīng)過重新組合成的一張整體。本文將和大家分享一個(gè)基于Python selenium的破解拼圖驗(yàn)證碼的腳本,需要的可以參考一下2022-02-02Python入門教程(四十三)Python的NumPy數(shù)據(jù)類型
這篇文章主要介紹了Python入門教程(四十二)Python的NumPy數(shù)組裁切,NumPy有一些額外的數(shù)據(jù)類型,并通過一個(gè)字符引用數(shù)據(jù)類型,例如 i 代表整數(shù),u 代表無符號(hào)整數(shù)等,需要的朋友可以參考下2023-05-05python實(shí)現(xiàn)QQ定時(shí)發(fā)送新年祝福信息
大家好,本篇文章主要講的是python實(shí)現(xiàn)QQ定時(shí)發(fā)送新年祝福信息,感興趣的同學(xué)感快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02