Оператор with это просто синтаксический сахар.
Его удобно использовать при написании классов для работы с базами, файлами, а также какими либо сетевыми соединениями, где постоянно нужно выполнять ряд рутинных операций.
"Под капотом" with выполняются два магических метода:
__enter__
при открытии контекста
__exit__
при выходе из контекста.
Соответственно чтобы ваш класс можно было использовать с конструкцией with, вам достаточно объявить эти два метода в своем классе и указать операции, которые будут каждый раз выполняться при "открытии" и "закрытии".
Хорошая статья по данной теме
https://pavel-karateev.gitbook.io/intermediate-pyt...