__del__
adalah finalisator . Ini dipanggil ketika sebuah objek dikumpulkan sampah yang terjadi di beberapa titik setelah semua referensi ke objek telah dihapus.
Dalam kasus sederhana ini bisa terjadi tepat setelah Anda mengatakan del x
atau, jika x
adalah variabel lokal, setelah fungsi berakhir. Secara khusus, kecuali ada referensi melingkar, CPython (implementasi Python standar) akan segera mengumpulkan sampah.
Namun, ini adalah detail implementasi CPython. Satu-satunya properti yang diperlukan dari pengumpulan sampah Python adalah bahwa ini terjadi setelah semua referensi dihapus, jadi ini mungkin tidak perlu terjadi segera setelah itu dan mungkin tidak terjadi sama sekali .
Terlebih lagi, variabel dapat hidup untuk waktu yang lama karena berbagai alasan , misalnya pengecualian yang menyebar atau introspeksi modul dapat membuat jumlah referensi variabel lebih besar dari 0. Selain itu, variabel dapat menjadi bagian dari siklus referensi - CPython dengan pengumpulan sampah dihidupkan paling banyak , tapi tidak semua, siklus seperti itu, itupun hanya secara berkala.
Karena Anda tidak memiliki jaminan bahwa itu dijalankan, seseorang tidak boleh memasukkan kode yang Anda perlukan __del__()
- sebaliknya, kode ini milik finally
klausul try
blok atau manajer konteks dalam sebuah with
pernyataan. Namun, ada kasus penggunaan yang valid untuk __del__
: mis. Jika sebuah objek X
mereferensikan Y
dan juga menyimpan salinan Y
referensi dalam global cache
( cache['X -> Y'] = Y
) maka akan lebih sopan jika X.__del__
juga menghapus entri cache.
Jika Anda tahu bahwa destructor menyediakan (melanggar pedoman di atas) pembersihan diperlukan, Anda mungkin ingin menyebutnya langsung , karena tidak ada yang khusus tentang hal itu sebagai metode: x.__del__()
. Jelas, Anda harus melakukannya hanya jika Anda tahu bahwa tidak keberatan untuk dipanggil dua kali. Atau, sebagai upaya terakhir, Anda dapat mendefinisikan kembali metode ini menggunakan
type(x).__del__ = my_safe_cleanup_method