I didn't know about Protocol! How does this differ from ABC?
(You can also do this with ABCs by writing custom __subclasscheck__ and __instancecheck__ functions, but those can't be statically checked, they only work at runtime)
AFAIK protocols actually use ABCs internally(?) Just in a more constrained form that static type checkers can understand.