The @property decorator is a built-in decorator in Python that allows a method to be accessed as an attribute instead of as a method. When this decorator is applied to a method, it makes the method act like a read-only property of an object.

        The purpose of @property is to provide a more elegant way of accessing and setting object properties without changing the interface of the class. By using the @property decorator, a method that would normally be called as a method, such as obj.get_property(), can be accessed like an attribute, such as obj.property.

        Here is an example of using the @property decorator:

class Person:
    def __init__(self, first_name, last_name):
        self._first_name = first_name
        self._last_name = last_name

    @property
    def full_name(self):
        return f"{self._first_name} {self._last_name}"

person = Person("John", "Doe")
print(person.full_name)  # output: John Doe

        In the above example, full_name is a read-only property of the Person class, which concatenates the first name and last name of the person. The @property decorator is used to make the full_name method act like a read-only property, allowing it to be accessed like an attribute of the person object.