Почему оператор называется with?
Вполне логичное название. Оператор with объявляет некоторый контекст, с которым работает код внутри блока оператора. Код практически дословно можно перевести:
with open('some.file') as f:
    for line in f:
        print(line)
с открыть('некоторый.файл') как f:
    для каждой строки в f:
        напечатать(строку)
Оператор with это просто синтаксический сахар.
Его удобно использовать при написании классов для работы с базами, файлами, а также какими либо сетевыми соединениями, где постоянно нужно выполнять ряд рутинных операций.

"Под капотом" with выполняются два магических метода: 
__enter__ при открытии контекста
__exit__ при выходе из контекста.

Соответственно чтобы ваш класс можно было использовать с конструкцией with, вам достаточно объявить эти два метода в своем классе и указать операции, которые будут каждый раз выполняться при "открытии" и "закрытии".

Хорошая статья по данной теме https://pavel-karateev.gitbook.io/intermediate-pyt...