Tôi đã có một lớp kết thúc tốt đẹp một số chức năng xử lý tệp tôi cần. Một lớp khác tạo ra một thể hiện của filehandler
và sử dụng nó trong một khoảng thời gian không xác định. Cuối cùng, caller
bị hủy, sẽ hủy tham chiếu duy nhất thành filehandler
.Trình bao bọc lớp quanh tệp - cách thích hợp để đóng xử lý tệp khi không còn tham chiếu
Cách tốt nhất để giữ filehandler
đóng tệp là gì?
Tôi hiện đang sử dụng __del__(self)
nhưng sau khi nhìn thấy severaldifferentquestionsand articles, tôi theo ấn tượng này được coi là một điều xấu .
class fileHandler:
def __init__(self, dbf):
self.logger = logging.getLogger('fileHandler')
self.thefile = open(dbf, 'rb')
def __del__(self):
self.thefile.close()
Đó là bit liên quan của trình xử lý. Toàn bộ điểm của lớp là trừu tượng hóa các chi tiết về cách làm việc với đối tượng tệp cơ bản, và cũng để tránh đọc toàn bộ tệp vào bộ nhớ một cách không cần thiết. Tuy nhiên, một phần của việc xử lý tệp cơ bản sẽ đóng nó khi đối tượng nằm ngoài phạm vi.
caller
không được coi là biết hoặc quan tâm đến các chi tiết liên quan đến số filehandler
. Đây là công việc của filehandler
để giải phóng mọi tài nguyên cần thiết có liên quan khi nó nằm ngoài phạm vi. Đó là một trong những lý do nó được tóm tắt ngay từ đầu. Vì vậy, tôi dường như phải đối mặt với việc di chuyển mã filehandler
vào đối tượng gọi điện thoại hoặc xử lý sự trừu tượng bị rò rỉ.
Suy nghĩ?
Bí quyết tốt khi mở tệp trong '__enter __()' - bạn cũng có thể thực hiện một số phép thuật trong đó để giữ lại vị trí tệp giữa mở/đóng. – kindall
Rất đẹp, điều này gần hơn với những gì tôi muốn. Các chu kỳ ref là điều đầu tiên tôi kiểm tra, và tôi không có bất kỳ. Nhưng một số bài báo nói rằng toàn bộ chuỗi đối tượng sẽ không thể thu thập được nếu một đối tượng lá có phương thức del, bất kể chu kỳ ref. –
@SpencerRathbun: Tất cả tài liệu tôi có thể tìm thấy các trạng thái không thể thu thập được ** chỉ khi ** có chu kỳ ref. –