Property Decorators
Fist thing, What is Decorators? In Python, a decorators is a special type of function that modifies or enhances the behaviour of another function or method without changing its actual code. Here is an analogy:- Imagine you have a gift, let say a book. To make it special you wrap up with gift paper. Just like decorators. Here is the problem when I change the model name of our car attribute it get change but it shouldn't be happened:- class Car: total_car=0 def __init__(self,brand,model): self.brand=brand self.model=model Car.total_car+=1 def full_function(self): return f"{self.brand} {self.model}" def fuel_type(self): return "Petrol or Desiel" @staticmethod def general_description(): return "Cars mean of transportation" class ElectricCar(Car): def __init__(self,brand,model,battery_size): super().__init__(brand,model) self.battery_size=battery_size def fuel_type(self): return "Electric Charge" Tata=Car("TATA","Sedan") Mahindera=Car("Mahindera","Geep") Tata.model="city" print(Tata.model) Output: city As you can see I can change model name how avoid this situation and make model read-only. We are going to use property method. What property method going to do is that having control over attribute so nobody can have access of it. class Car: total_car=0 def __init__(self,brand,model): self.brand=brand self.__model=model Car.total_car+=1 def full_function(self): return f"{self.brand} {self.__model}" def fuel_type(self): return "Petrol or Desiel" @staticmethod def general_description(): return "Cars mean of transportation" @property def model(self): return self.__model class ElectricCar(Car): def __init__(self,brand,model,battery_size): super().__init__(brand,model) self.battery_size=battery_size def fuel_type(self): return "Electric Charge" Tata=Car("TATA","Sedan") Mahindera=Car("Mahindera","Geep") Tata.model="city" print(Tata.model) Output: ERROR! Traceback (most recent call last): File "", line 26, in File "", line 5, in __init__ AttributeError: property 'model' of 'Car' object has no setter You need private the model attribute. Use property method to have access of an attribute so nobody can modify it. It also says you cannot even modify with function (model()). After erasing Tata.model="city" then only you can have access to it.

Fist thing,
What is Decorators?
In Python, a decorators is a special type of function that modifies or enhances the behaviour of another function or method without changing its actual code.
Here is an analogy:-
Imagine you have a gift, let say a book. To make it special you wrap up with gift paper. Just like decorators.
Here is the problem when I change the model name of our car attribute it get change but it shouldn't be happened:-
class Car: total_car=0 def __init__(self,brand,model): self.brand=brand self.model=model Car.total_car+=1 def full_function(self): return f"{self.brand} {self.model}" def fuel_type(self): return "Petrol or Desiel" @staticmethod def general_description(): return "Cars mean of transportation" class ElectricCar(Car): def __init__(self,brand,model,battery_size): super().__init__(brand,model) self.battery_size=battery_size def fuel_type(self): return "Electric Charge" Tata=Car("TATA","Sedan") Mahindera=Car("Mahindera","Geep") Tata.model="city" print(Tata.model)
Output: city
As you can see I can change model name how avoid this situation and make model read-only.
We are going to use property method. What property method going to do is that having control over attribute so nobody can have access of it.
class Car: total_car=0 def __init__(self,brand,model): self.brand=brand self.__model=model Car.total_car+=1 def full_function(self): return f"{self.brand} {self.__model}" def fuel_type(self): return "Petrol or Desiel" @staticmethod def general_description(): return "Cars mean of transportation" @property def model(self): return self.__model class ElectricCar(Car): def __init__(self,brand,model,battery_size): super().__init__(brand,model) self.battery_size=battery_size def fuel_type(self): return "Electric Charge" Tata=Car("TATA","Sedan") Mahindera=Car("Mahindera","Geep") Tata.model="city" print(Tata.model)
Output: ERROR! Traceback (most recent call last): File "", line 26, in File "", line 5, in __init__ AttributeError: property 'model' of 'Car' object has no setter
- You need private the model attribute.
- Use property method to have access of an attribute so nobody can modify it.
- It also says you cannot even modify with function (model()).
- After erasing Tata.model="city" then only you can have access to it.