ABC and Protocol serve entirely different use cases. ABC enforces structure of a subclass, while Protocol enforces structure of an instance. Moreover, ABC implements actual logical behaviors while Protocol does none.
I think my recent use case of ABC demonstrates its purpose well:
But now imagine how someone who wishes to use this mixin class to easily gain this small capability of a context manager, only to end up with a metaclass conflict with a big metaclass-based base class that actually legitimately needs a metaclass, all because of __instancecheck__ and __subclasscheck__ that aren’t even used.