In many object-oriented programming languages, data within an object can be explicitly hidden from external access by using specific keywords such as private or protected. This prevents misuse by not allowing access to the data from object.
Private and Protected Attributes
All attributes (data in object) in python classes are publicly accessible. Therefore, you don't have explicit control over data access. Using naming conventions by having one underscore as a prefix for protected attributes and two underscores for private attributes. As it is just naming convention showing the intention, users can still access attributes externally even after the naming conventions properly applied.
Python performs name mangling on private attributes. Every member with a double underscore will be changed to object._class__variable.
So, a responsible programmer, upon seeing an attribute with such a naming convention, would refrain from accessing it outside its scope.
@property decorator will define a setter, getter, and deleter methods. These special methods dictate how others should set, get, and delete attributes in a controlled way.
@property decorator defines a getter method, properties are accessed like an attribute, it cannot be called like a method.
@propertyname.setter decorator defines a setter method. It is used to set a value to the attribute.
@propertyname.deleter decorator defines a deleter, it is used to delete any attribute.