我的 Python 類定義了 __del__,但當我刪除物件時它沒有被呼叫


__del__ 是 Python 中的魔法方法。魔法方法允許我們在面向物件程式設計中做一些非常巧妙的技巧。它們也被稱為 Dunder 方法。這些方法由用作字首和字尾的兩個下劃線 (__) 來識別。

在 Python 中,我們使用 __new__() 建立物件,並使用 __init__() 進行初始化。但是,要銷燬物件,我們有 __del__()。

示例

讓我們建立一個並刪除一個物件 -

class Demo: def __init__(self): print("We are creating an object."); # destructor def __del__(self): print("We are deleting an object."); # Createing and deleting an object ob = Demo(); del ob;

輸出

We are creating an object.
We are deleting an object.

原因

但是,如果類定義了 __del__ 但在刪除物件時沒有被呼叫,則原因可能有很多 -

  • del 語句不一定呼叫 __del__() - 它只是簡單地遞減物件的引用計數,如果此計數達到零,則呼叫 __del__()。

  • __del__() 方法可能會在隨機時間被呼叫。 - 如果你的資料結構包含迴圈連結,則引用計數將永遠不會回到零。Python 執行一個演算法來檢測此類迴圈,但垃圾回收器可能會在對你的資料結構的最後一個引用消失後一段時間執行。

修復問題

以下是修復方法 -

  • 不要直接呼叫 __del__() - _del__() 應該呼叫 close(),而 close() 應該確保它可以對同一個物件多次呼叫。

  • 避免迴圈引用 - 使用 weakref 模組避免迴圈引用。它允許你指向物件而不增加它們的引用計數。weakref 模組也可用於獲取類的例項

更新於: 2022-09-19

3K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.