I have used @property to suggest that variables be read-only.
That said, I believe that using the (I believe fairly common) pattern of defining a property as a no-op wrapper around a corresponding "private" (single underscore) attribute tends to be a more pythonic solution to the read-only dilemma. Specifically, that pattern would be defining
@property
def value(self):
return self._value
and then just not giving a setter property (or giving a setter that raises NotImplementedError or something similar). In this way, I have made it clear to users that they may use the property and can expect it to be there in the future (it becomes easily documented, and also it offers more guarantees than the underscore "private" attribute). At the same time, I've told the user that it shouldn't be messed with, but any user could go in and do what they want with the _value attribute, enabling folks like Andre to make customizations as desired—but at their own risk.
Since this pattern is pretty easy to implement, and I think its more pythonic, I'd opt to keep things as they are.