Курс Python → Протокол управления контекстом

Методы __enter__ и __exit__ являются частью протокола управления контекстом в Python. Они позволяют определить поведение объекта при входе и выходе из блока with. Контекстные менеджеры обычно используются для работы с ресурсами, которые нужно освободить после использования, например, файлами или соединениями с базой данных.

Метод __enter__ выполняется при входе в блок with и возвращает объект, который будет связан с переменной в этом блоке. Внутри метода __enter__ обычно происходит инициализация ресурсов, например, открытие файла для чтения или записи. После выполнения кода внутри блока with метод __exit__ автоматически вызывается для освобождения ресурсов.


class File:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        self.file = open(self.filename, self.mode)
        print(f'Открыт файл {self.filename}')
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        self.file.close()
        print(f'Файл {self.filename} закрыт')

В приведенном примере класс File реализует протокол контекстного менеджера. Метод __enter__ открывает файл и выводит сообщение о его открытии, а метод __exit__ закрывает файл и выводит сообщение о его закрытии. При использовании этого класса в блоке with файл будет автоматически закрыт после завершения работы с ним.

Использование контекстных менеджеров позволяет улучшить читаемость и безопасность кода, так как гарантируется освобождение ресурсов даже в случае возникновения исключения. При написании собственных контекстных менеджеров важно правильно реализовать методы __enter__ и __exit__ для корректной работы с ресурсами.

Твои коллеги будут рады, поделись в

Автор урока

Дмитрий Комаровский
Дмитрий Комаровский

Автоматизация процессов
в КраснодарБанки.ру

Другие уроки курса "Python"

  1. Синхронизация потоков с time.sleep()
  2. Закрытие файла в Python
  3. JSON-esque в Python
  4. Сравнение def и lambda функций в Python
  5. Проверка типов с помощью isinstance
  6. Область видимости переменных
  7. Сравнение неупорядоченных списков
  8. Философия Python
  9. Удаление знаков препинания в Python
  10. Оператор Walrus в Python
  11. Добавление элементов в список
  12. Генерация чисел с range()
  13. Объединение списков с помощью zip
  14. Локальные переменные.
  15. Использование модуля __future__
  16. Генерация UUID в Python
  17. Преобразование строк в числа с плавающей запятой
  18. Установка Python3.7 и PIP
  19. Профилирование с cProfile
  20. Стать Python-разработчиком
  21. Функции map, filter, reduce
  22. Особенности запятых в Python
  23. Удаление символов новой строки в Python.
  24. Python и Монти Пайтон
  25. Логирование с Logzero
  26. Ускорение кода с помощью векторизации
  27. Поиск индекса элемента в списке
  28. Присоединение элементов коллекции
  29. Эффективная конкатенация строк с использованием join()
  30. Метод __float__ в Python
  31. Метод rxor для операции побитового исключающего «или»
  32. Работа с базами данных SQLite
  33. Работа со временем в Python
  34. Работа с коллекциями Python
  35. Работа с deque из collections
  36. Списки в Python: синтаксис представления
  37. Метод setitem в Python
  38. Измерение времени выполнения кода
  39. Поиск HTML-элементов с BeautifulSoup
  40. Обработка ошибок в Python
  41. Создание инструмента обнаружения плагиата
  42. Работа с файлами в Python
  43. Список переменных в Python
  44. Реализация операции -= для пользовательского класса

Marketello читают маркетологи из крутых компаний