Mam klasę, która opakowuje niektóre funkcje obsługi plików, których potrzebuję. Inna klasa tworzy instancję filehandler
i używa jej przez nieokreślony czas. Ostatecznie, caller
jest zniszczony, co niszczy jedyne odniesienie do filehandler
.Zawijanie klasy wokół pliku - właściwy sposób zamykania uchwytu pliku, gdy nie ma już odwołania
Jaki jest najlepszy sposób, aby zamknąć plik filehandler
?
Używam obecnie __del__(self)
ale po obejrzeniu severaldifferentquestionsand articles, jestem pod wrażeniem, to jest uważany złe.
class fileHandler:
def __init__(self, dbf):
self.logger = logging.getLogger('fileHandler')
self.thefile = open(dbf, 'rb')
def __del__(self):
self.thefile.close()
To jest kawałek wydania instrukcji obsługi. Celem całej klasy jest usunięcie szczegółów pracy z podstawowym obiektem pliku, a także niepotrzebne przeczytanie całego pliku w pamięci. Jednak część obsługi pliku bazowego jest zamykanie go, gdy obiekt wykracza poza zakres.
Urządzenie caller
nie powinno wiedzieć ani dbać o szczegóły związane z filehandler
. Zadaniem filehandler
jest uwolnienie wszelkich niezbędnych zasobów, gdy nie mieszczą się one w zakresie. To jeden z powodów, dla których został w ogóle wyodrębniony. Tak więc wydaje mi się, że mam do czynienia z przenoszeniem kodu filehandler
do obiektu wywołującego lub radzenia sobie z nieszczelną abstrakcją.
Myśli?
Ładna sztuczka z otwarciem pliku w '__enter __()' - można również zrobić trochę magii tam utrzymać pozycję pliku między otwiera/zamyka. – kindall
Bardzo ładnie, to jest o wiele bliższe temu, co chciałem. Refleksy to pierwsza rzecz, którą sprawdziłem i nie mam żadnych. Ale niektóre artykuły mówią, że całe łańcuchy obiektów będą nieosiągalne, jeśli obiekt liścia ma metodę del, niezależnie od korekcji. –
@SpencerRathbun: Cała dokumentacja, którą udało mi się znaleźć stwierdza, że pozycje są nieściągalne ** tylko jeśli ** są cykle ref. –