What you are suggesting is the opposite of what’s desired here. I want to be able to write Protocols that are flexible enough to not care about implementation details (like attribute vs property). This is crucial in order to be able to type hint generic functions that can interact with classes from different libraries, without having to write tons of overloads. For example, I may have a protocol like
class SupportsShape(Protocol):
shape: tuple[int, ...] # note: usually not writeable.
That can be used for numpy.ndarray / pandas.DataFrame / torch.Tensor, etc. If some library decides to implement shape as a property, this Protocol suddenly doesn’t match anymore.