Вопрос проверяет понимание протокола контекстного менеджера и механизма with.
Чтобы объект работал в with, нужно реализовать методы __enter__ и __exit__. Метод __enter__ выполняется при входе в блок и возвращает объект, который будет доступен внутри with. Метод __exit__ вызывается при выходе, даже если произошло исключение. Обычно он используется для освобождения ресурсов.
Контекстные менеджеры управляют ресурсами и гарантируют корректное завершение операций.
Определение: Контекстный менеджер — объект, который определяет методы __enter__ и __exit__ и используется в конструкции with.
Упрощённо:
manager = Manager()
value = manager.__enter__()
try:
# тело блока with
pass
finally:
manager.__exit__(...)
__enter__(self)
Вызывается при входе в блок.
Возвращает объект, который будет доступен после as.
__exit__(self, exc_type, exc_value, traceback)
Вызывается при выходе:
закрывает ресурсы;
может обработать исключение;
если вернуть True, исключение будет подавлено.
class FileManager:
def __init__(self, filename):
self.filename = filename
def __enter__(self):
self.file = open(self.filename, "w")
return self.file
def __exit__(self, exc_type, exc_value, traceback):
self.file.close()
Использование:
with FileManager("test.txt") as f:
f.write("hello")
работа с файлами;
соединения с БД;
блокировки (Lock);
временные настройки окружения.
Для пользовательского контекстного менеджера необходимо реализовать методы __enter__ и __exit__, которые управляют входом в контекст и корректным освобождением ресурсов.