Zacznijmy od początku.
Język python pozwala na obsługę plików. Plik otwierasz następnie czytasz z niego dane. Po wykonaniu tych czynności nie możesz zapomnieć o zamknięciu pliku.
Przykład poniżej otwiera plik o nazwie moj.txt następnie wyświetla jego zawartość na ekranie oraz zamyka plik:
f=open("moj.txt","r")
dane=f.read()
print(dane)
f.close()
Niestety często zdarza się, że zapomnimy o tym aby zamknąć plik. Z pomocą właśnie przychodzi instrukcja with. Nazywana jest również menadżerem kontekstu. Zobacz na poniższy przykład:
with open("moj.txt","r") as f:
dane=f.read()
print(dane)
Powyższy kod robi dokładnie to samo co jego poprzednik. Zwróć uwagę, że nigdzie nie wywołuje metody close. Plik zostanie sam zamknięty po wyjściu z bloku kodu with.
Nie ma w tym żadnej magii. W momencie wejścia do metody with wywoływana jest metoda magiczna __enter__ zaś w momencie wyjścia metoda __exit__.
Jeśli chciałbyś używać obiektów swojej własnej klasy z instrukcją with musisz zadbać o to by nadpisać metodę __enter__ oraz __exit__.
Zobacz na kod poniżej:
class moja:
def __enter__(self):
print("Poczatek")
def __exit__(self,type, value, traceback):
print("Koniec")
with moja() as f:
print("HEJ:)")
Uruchamiając kod na ekranie zobaczyli byśmy trzy napisy. Najpierw zrealizowała by się metoda __enter__ czyli wyświetliłby się napis "Początek" Następnie wnętrze with, czyli na ekranie ukazał by się napis "HEJ". Na końcu wykonała by się metoda __exit__ powodująca wyświetlenie napisy "Koniec".
Zapraszam cię również do przeczytania tego artykułu:
https://printpython.pl/poczatki/menadzer-kontekstu-slow-kilka-o-instrukcji-with/