Python 3.6+contextlibпонятие
contextlib.AbstractContextManager
протоколы
Абстрактный базовый класс контекстного менеджера (протокол __enter__/__exit__); любой класс с этими методами — его виртуальный подкласс.
Синтаксис
class C(contextlib.AbstractContextManager): ...
Это не обязанность, а удобство: issubclass проходит для любого класса с __enter__ и __exit__, даже если он ничего не наследовал, — поэтому свой менеджер писать через наследование не нужно. Смысл наследования в том, что базовый класс уже даёт __enter__, возвращающий self, и остаётся описать только __exit__; ещё его удобно указывать в аннотациях типов. Асинхронные менеджеры сюда не попадают — у них отдельный AbstractAsyncContextManager.
Примеры
import contextlib
class CM:
def __enter__(self): return self
def __exit__(self, *a): return False
print(issubclass(CM, contextlib.AbstractContextManager)) # → True
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности