中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中的對象析構函數del怎么用

發布時間:2022-03-22 13:37:29 來源:億速云 閱讀:269 作者:iii 欄目:開發技術

這篇文章主要介紹“Python中的對象析構函數del怎么用”,在日常操作中,相信很多人在Python中的對象析構函數del怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python中的對象析構函數del怎么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Python中的對象析構函數del怎么用

前言:

Python 中的類的構造函數 __init__ , 每當實例產生就會調用這個構造函數。

反過來,每當實例對象需要被垃圾收集被收回時,就需要用到析構函數 __del__ 。

__del__ 方法是類的一種特殊方法。可以利用 __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')
    bob.live()

if __name__ == '__main__':
    main()

運行該代碼,輸出結果為:

Hello,Bob
Bob
Goodbye,Bob

我們得到上面的輸出是因為當代碼即將結束時,不再需要類 Life,因此它已準備好被銷毀。 在類 Life 被銷毀之前,會自動調用 __del__ 方法。

還可以通過調用 del 手動調用 __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()

執行結果:

Hello,Bob
Goodbye,Bob

值得注意的是:del x 并不直接調用 x.__del__() ,前者將 x 的引用計數減一,而后者僅在其引用計數達到零時才被調用。

在 Python 中,任何未使用的對象(如內置類型或類的實例)在不再使用時會自動從內存中刪除(移除)。 這種釋放和回收未使用內存空間的過程稱為垃圾回收。

在Python中何時使用__del__?

重要的是要注意,當對象處于銷毀的過程中,調用 __del__ 方法(未損壞后),因此仍然可以在__del__方法中訪問屬性。

由于__del__ 可以訪問對象的數據成員,因此應該確保對象的填充刪除,以便沒有內存泄露。

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

執行結果:

Switching on the Phone
Open App
Closed App
Switching off the Phone

在這個例子中,如果我們沒有在__del__ 方法中銷毀手機的屬性 app,它就會留在內存中,導致內存泄漏。

析構函數使用緊要

Python 中的析構函數并不像 C++ 中那樣被頻繁使用,因為它存在一些眾所周知的警告和極少數鮮為人知的暗坑。

盡量減少使用 __del__ 函數:

  • 第一,因為 Python 在回收實例時,會自動回收該實例擁有的所有內存空間,所以析構函數并不需要考慮空間管理。所以也就失去了手動寫 __del__ 的意義。

  • 第二,無法預測一個實例什么時候會被回收。有時候你想觸發析構函數時,系統表中對對象的引用會阻止析構函數的執行。Python 也無法保證解釋器退出時,一個仍然存在的對象會調用其析構函數。

  • 第三,__del__ 可能會引發的異常會直接向 sys.stderr(標準錯誤流) 打印一條警告消息,而不是觸發一個異常事件。因為它通過垃圾收集器運行在不可預料的上下文中。

  • 第四,當我們期待垃圾回收時,對象間的循環引用可能會阻止其發生。

到此,關于“Python中的對象析構函數del怎么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

雅安市| 涟源市| 连山| 靖边县| 伊吾县| 苗栗市| 广灵县| 道真| 青岛市| 连山| 沙河市| 随州市| 盐山县| 永修县| 高州市| 西安市| 河曲县| 宜兴市| 丹棱县| 金川县| 都匀市| 江北区| 赫章县| 大悟县| 余江县| 濉溪县| 普兰店市| 于都县| 金湖县| 漳浦县| 杭锦旗| 铁岭市| 耿马| 拉孜县| 新泰市| 班戈县| 彭水| 兴海县| 龙岩市| 得荣县| 延寿县|