Курс 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. Измерение времени выполнения кода
  2. Установка Home Assistant
  3. Работа с библиотекой xkcd
  4. Тестирование функции сложения
  5. Метод __imod__ для Python
  6. Функция enumerate в Python
  7. Проверка версии Python
  8. Объединение списков с помощью zip
  9. Функции range() в Python
  10. Шаблоны Flask: условия и циклы
  11. Аннотации типов в Python
  12. Измерение времени выполнения кода в Python
  13. Распаковка элементов последовательности
  14. Преобразование списков в словарь
  15. Оператор * в Python
  16. Работа с CSV файлами в Python
  17. Создание графики с черепахой
  18. Оформление кода на Python
  19. Декораторы в Python
  20. Синхронизация доступа к ресурсам
  21. Определение функций с необязательными аргументами
  22. Атрибуты массивов в Numpy
  23. Управление ресурсами с контекстными менеджерами
  24. Настройка вывода в Numpy
  25. Тип данных TypeVarTuple
  26. Определение индекса элемента списка
  27. Обмен данными с asyncio.Queue
  28. Объединение списков в Python
  29. Исключение NotImplementedError
  30. Итерация по копии коллекции
  31. Профилирование данных с Pandas
  32. Python: возвращение нескольких значений
  33. Метод __int__ в Python
  34. Работа с кортежами в Python
  35. Логические операторы в Python
  36. Импорт модулей в Python 3.12
  37. Создание итератора
  38. Пропуск начальных строк с помощью dropwhile()
  39. Бесконечная проверка в Python
  40. Подписка на Kaspersky Team
  41. Установка и использование Python-dateutil
  42. Метод округления чисел
  43. Резервирование символов в Python
  44. Логирование с Loguru
  45. Создание коллекций из выражения-генератора
  46. Оператор Walrus в Python
  47. Удаление дубликатов с помощью множеств
  48. Список и кортеж в Python

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