Computer >> Máy Tính >  >> Lập trình >> Python

Làm cách nào để dọn dẹp một cách chính xác một đối tượng Python?


Dọn dẹp sẽ xảy ra với các hình cầu bằng cách đặt chúng thành Không có. Người dân địa phương tự hủy vào cuối buổi. Hàm __del__ được gọi bởi Python đặt toàn cầu thành Không.

Hãy xem xét đoạn mã sau, nơi có tất cả các đối tượng trong lớp đã cho -

Ví dụ

class Counter:
    Count = 0   # This is the count of objects of this class
    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

Nếu không có del cuối cùng, bạn sẽ có một ngoại lệ.

Từ tài liệu Python liên quan đến __del__ -

Cảnh báo:Do ​​các trường hợp bấp bênh mà các phương thức __del __ () được gọi, các ngoại lệ xảy ra trong quá trình thực thi của chúng sẽ bị bỏ qua và thay vào đó, một cảnh báo sẽ được in tới sys.stderr. Ngoài ra, khi __del __ () được gọi để phản hồi một mô-đun đang bị xóa (ví dụ:khi quá trình thực thi chương trình được thực hiện xong), các toàn cầu khác được tham chiếu bởi phương thức __del __ () có thể đã bị xóa. Vì lý do này, các phương thức __del __ () phải thực hiện mức tối thiểu tuyệt đối cần thiết để duy trì các bất biến bên ngoài.

Nếu không có lệnh gọi rõ ràng tới del, __del__ chỉ được gọi ở cuối chương trình, Bộ đếm và / hoặc Bộ đếm có thể đã được GC-ed vào thời điểm __del__ được gọi (thứ tự các đối tượng được thu thập không phải là xác định). Ngoại lệ có nghĩa là Bộ đếm đã được thu thập. Bạn không thể làm bất cứ điều gì đặc biệt yêu thích với __del__.

Có hai giải pháp khả thi ở đây.

  • Sử dụng một phương thức hoàn thiện rõ ràng, chẳng hạn như close () cho các đối tượng tệp.

  • Sử dụng các tham chiếu yếu.