Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Cách dọn dẹp (clean up) Python object đúng cách?

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.