Empty __slots__ no more makes it a data protocol as __doc__ , __module__ and others.
Non-empty slots of course defines data attributes so does make it a data protocol, but that’s a separate issue.
(Dynamically calculated slots (e.g. __slots__ = (*thing,) are a different story.)