首頁  >  文章  >  後端開發  >  我的Python類別定義了__del__方法,但是當我刪除物件時它並沒有被調用

我的Python類別定義了__del__方法,但是當我刪除物件時它並沒有被調用

WBOY
WBOY轉載
2023-09-24 23:21:051219瀏覽

我的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 模組也可以用來取得類別的實例

以上是我的Python類別定義了__del__方法,但是當我刪除物件時它並沒有被調用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除