首頁 > 軟體

Python 中的物件解構函式__del__ 詳情

2022-03-22 16:00:33

前言:

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__​​ 方法(​​類似於在物件建立期間呼叫的 ​​__init__​​ 建構函式)。
  • ​​__del__​​ 方法類似於 C++ 和 Java 中的解構函式。用於銷燬物件的狀態。
  • Python 中,儘量減少解構函式的使用。

到此這篇關於Python 中的物件解構函式__del__ 詳情的文章就介紹到這了,更多相關Python 物件解構函式del內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com