Protocol из typing — это способ описать структурную типизацию (structural subtyping, duck typing со статической проверкой). Класс не обязан наследовать Protocol — достаточно реализовать нужные методы. Например, Protocol с def read(self) -> str будет матчить любой объект с таким методом. Это как интерфейсы в Go — implicit implementation. В отличие от ABC не нужно явное наследование. runtime_checkable позволяет делать isinstance проверку. Появился в Python 3.8.