Mam klasę, w której tworzę obiekt pliku w konstruktorze. Ta klasa wdraża również metodę wykończenia () w ramach jego interfejsu iw tej metodzie zamykam obiekt pliku. Problem polega na tym, że jeśli otrzymam wyjątek przed tym punktem, plik nie zostanie zamknięty. Informacje o klasie ma wiele innych metod korzystających z obiektu plików. Czy muszę owinąć wszystkie te w klauzuli wreszcie lub jest lepsze podejście?

Dzięki,

Barry

5
Baz 25 październik 2011, 16:00

3 odpowiedzi

Najlepsza odpowiedź

Możesz uczynić swoją klasą kontekstową menedżer, a następnie zawijaj tworzenie obiektów i użycie tej klasy w with - oświadczenie. Zobacz PEP 343 Szczegółowe informacje.

Aby dokonać klasy kontekstu, musi zaimplementować metody __enter__() i __exit__(). __enter__() jest wywoływany po wprowadzeniu with - oświadczenie, a __exit__() jest zagwarantowany, gdy go zostawisz, bez względu na to, jak.

Następnie możesz użyć swojej klasy takich:

with MyClass() as foo:
    # use foo here

Jeśli zdobędziesz swoje zasoby w konstruktorze, możesz zrobić __enter__() po prostu wróć self bez robienia niczego. __exit__() powinien połączyć się z metodą finish().

11
agf 25 październik 2011, 12:33

W przypadku krótkotrwałych obiektów plików, próbują parę próbną lub bardziej zwięzły z oświadczeniem jest zalecany jako czysty sposób, aby upewnić się, że pliki są przepłukiwane, a powiązane zasoby zostaną zwolnione.

W przypadku długich obiektów plików można zarejestrować się w ATEXIT () , aby uzyskać wyraźne zamknięcie lub po prostu polegać na czyszczeniu tłumacza, zanim wyjdzie.

W monicie interaktywnym większość ludzi nie przejmuje się prostymi eksperymentami, gdzie nie ma większego z nich do pozostawienia plików uległych lub polegających na refabrykucie lub GC do zamknięcia dla Ciebie.

Zamknięcie plików jest uważany za dobry technika. W rzeczywistości jednak nie jawnie zamknięcie plików rzadko ma jakiekolwiek zauważalne efekty.

3
Raymond Hettinger 25 październik 2011, 12:24

Możesz mieć albo try ... finally para lub dokonać menedżera kontekstu klasy A odpowiednie do użycia w instrukcji {x2}}.

1
Eli Bendersky 25 październik 2011, 12:06