Python 速查手冊

6.11 __del__()

__del__() 為類別 (class) 的預設方法 (method) 之一,不再使用物件 (object) 的時候就會執行 __del__() 方法,也就是俗稱的解構子 (destructor) ,為什麼需要解構子呢?因為物件不再使用就會被資源回收,此時可利用解構子對該物件作最後必要的處理,像是儲存資料或是傳送訊息給類別或其他物件等等。

這邊的 Demo 類別用簡單的例子示範 __del__() 方法的定義,當建立 Demo 類別的變數 d 之時,就印出「物件已建立」,而 d 被重新指派為 None 之後,由於 Demo 型態的物件消失與變數 (variable) d 的連結,因此會執行 __del__() 方法

class Demo:
    def __init__(self):
        print("物件已建立")
    
    def __del__(self):
        print("物件已刪除")

if __name__ == "__main__":
    d = Demo()
    d = None

《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:destructor01.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 destructor01.py
物件已建立
物件已刪除
$

另外用關鍵字 (keyword) del 刪除變數 d 也有同樣的效果

from destructor01 import Demo

if __name__ == "__main__":
    d = Demo()
    del d

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:destructor02.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 destructor02.py
物件已建立
物件已刪除
$

不過,只要 Demo 型態的物件仍然被其他變數參考,就不會執行 __del__() 方法,例如這裡先建立變數 d1Demo() 型態的物件,接著把 d1 指派給 d2 ,當 d1 被重新指派為 None 之後,原先物件仍然跟 d2 連結,因此就不會執行 __del__() 方法

from destructor01 import Demo

if __name__ == "__main__":
    d1 = Demo()
    d2 = d1
    d1 = None

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:destructor03.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 destructor03.py
物件已建立
物件已刪除
$
留意以上的程式仍會印出「物件已刪除」,這是因為程式執行結束,結束前直譯器會呼叫每個物件的 __del__() 方法,原先被程式佔用的記憶體空間都會還給作業系統,因此直譯器會主動做資源回收。

上一頁: 6.10 多型
Python 速查手冊 - 目錄
下一頁: 6.12 迭代器
回 Python 教材首頁