Attributes Vs Properties

class Person():
    def __init__(self):
        self._name = "test"
 
    @property
    def name(self):
        return self._name
 
    @name.setter
    def name(self, value):
        self._name = value

Given the above class, attributes are stored in a dictionary __dict__.

a = Person()
 
# both gives the same result.
 
a._name # "test"
a.name # "test"
 
# However, "name" as an attribute is not present in __dict__
 
print(a.__dict__)
{'_name': 'test'}

We can set attribute by changing the a.__dict__ elements.

a.__dict__['_name'] = "some-name"
 
a._name # "some-name"
a.name # "some-name"

Changing attributes like below changes the corresponding value inside __dict__.

a._name = "good name"
 
a._name # "good name"

When an attribute is accessed on an object, it looks in the __dict__ first and then moves to next finding if not found in __dict__.

Python distinguishes between properties and attributes by their implementation. Properties are not stored in __dict__.

References

  1. https://www.pythonmorsels.com/python-setattr/