Cleanup globals bằng cách set thành None. Locals tự hủy ở cuối session. Hàm __del__ do Python gọi set globals thành None.
Ví dụ cleanup tất cả object trong class:
Ví dụ
class Counter:
Count = 0 # đếm object của class này
def __init__(self, name):
self.name = name
print(name, 'created')
Counter.Count += 1
def __del__(self):
print(self.name, 'deleted')
Counter.Count -= 1
if Counter.Count == 0:
print('Last Counter object deleted')
else:
print(Counter.Count, 'Counter objects remaining')
x = Counter("First")
del x
Không có del cuối sẽ gây exception.
Từ Python docs về __del__: Cảnh báo - do hoàn cảnh nguy hiểm khi __del__() được gọi, exception xảy ra lúc execute bị bỏ qua, warning in ra stderr. Khi __del__() invoke do module bị xóa (kết thúc chương trình), globals khác tham chiếu bởi __del__() có thể đã bị xóa. Nên làm tối thiểu trong __del__() để maintain external invariants.
Không có explicit del, __del__ chỉ gọi ở cuối chương trình, Counter/Count có thể đã GC trước khi __del__ chạy (thứ tự GC không deterministic). Exception nghĩa là Counter đã collected. Không làm gì fancy trong __del__.
Hai giải pháp:
- Dùng explicit finalizer method, ví dụ
close()cho file object. - Dùng weak references.