Ok property decorators are used so that you can define a method as a "getter" for a class attribute, In simple words you can access methods as attributes rather than methods. Have look in this example.
class Main: def __init__(self, name): self._name = name @property def name(self): return self._name obj = Main("Roger") print(obj.name)
This outputs the name "Roger", But note inside print we are calling name as attribute
class Main: def __init__(self, name): self._name = name @property def name(self): return self._name @name.setter def name(self, new_name): self._name = new_name obj = Main("Roger") obj.name = "Manu" print(obj.name)
Here we are using setter and then later setting name as "Manu", which outputs as Manu.
class Main: def __init__(self, name): self._name = name @property def name(self): return self._name @name.setter def name(self, new_name): self._name = new_name @name.deleter def name(self): del self._name obj = Main("Roger") obj.name = "Manu" del obj.name print(obj.name)
Here print gives an error "AttributeError: 'Main' object has no attribute '_name'. Did you mean: 'name'"
But if we change code before print like
obj = Main("Roger") obj.name = "Manu" #del obj.name print(obj.name)
Now we get output as "Manu". As delete is not deleting the value.