__del__
là một hoàn thiện . Nó được gọi khi một đối tượng được thu thập rác , xảy ra vào một thời điểm nào đó sau khi tất cả các tham chiếu đến đối tượng đã bị xóa.
Trong trường hợp đơn giản, điều này có thể xảy ra ngay sau khi bạn nói del x
hoặc, nếu x
là một biến cục bộ, sau khi hàm kết thúc. Đặc biệt, trừ khi có các tham chiếu vòng tròn, CPython (triển khai Python tiêu chuẩn) sẽ thu gom rác ngay lập tức.
Tuy nhiên, đây là một chi tiết triển khai của CPython. Thuộc tính bắt buộc duy nhất của thu thập rác Python là nó xảy ra sau khi tất cả các tham chiếu đã bị xóa, vì vậy điều này có thể không cần thiết xảy ra ngay sau đó và có thể hoàn toàn không xảy ra .
Thậm chí nhiều hơn, các biến có thể tồn tại trong một thời gian dài vì nhiều lý do , ví dụ: ngoại lệ lan truyền hoặc nội quan mô-đun có thể giữ số lượng tham chiếu biến lớn hơn 0. Ngoài ra, biến có thể là một phần của chu kỳ tham chiếu - CPython với tính năng thu gom rác được bật hầu hết , nhưng không phải tất cả, các chu kỳ như vậy, và thậm chí sau đó chỉ định kỳ.
Vì bạn không đảm bảo nó được thực thi, nên không bao giờ được đặt mã mà bạn cần chạy __del__()
- thay vào đó, mã này thuộc về finally
mệnh đề của try
khối hoặc của trình quản lý ngữ cảnh trong một with
câu lệnh. Tuy nhiên, có những trường hợp sử dụng hợp lệ cho __del__
: ví dụ: nếu một đối tượng X
tham chiếu Y
và cũng giữ một bản sao của Y
tham chiếu trong global cache
( cache['X -> Y'] = Y
) thì X.__del__
việc xóa mục nhập bộ nhớ cache sẽ là lịch sự .
Nếu bạn biết rằng destructor cung cấp (trong vi phạm các quy định trên) một dọn dẹp cần thiết, bạn có thể muốn gọi nó là trực tiếp , vì không có gì đặc biệt về nó như là một phương pháp: x.__del__()
. Rõ ràng, bạn chỉ nên làm như vậy nếu bạn biết rằng bạn không ngại bị gọi hai lần. Hoặc, phương sách cuối cùng, bạn có thể xác định lại phương pháp này bằng cách sử dụng
type(x).__del__ = my_safe_cleanup_method