What is @property?

The @property decorator creates methods that can be accessed like attributes, enabling computed properties and validation.

Basic Property

Create a computed property:

class Circle:
    def __init__(self, radius):
        self.radius = radius
    
    @property
    def area(self):
        return 3.14159 * self.radius ** 2

circle = Circle(5)
print(circle.area)  # 78.53975 (no parentheses!)

Setter and Deleter

Add setter methods:

class Temperature:
    def __init__(self):
        self._celsius = 0
    
    @property
    def celsius(self):
        return self._celsius
    
    @celsius.setter
    def celsius(self, value):
        if value < -273.15:
            raise ValueError("Temperature too low")
        self._celsius = value

temp = Temperature()
temp.celsius = 25
print(temp.celsius)  # 25

Read-only Property

Omit setter for read-only:

class Person:
    def __init__(self, birth_year):
        self.birth_year = birth_year
    
    @property
    def age(self):
        from datetime import datetime
        return datetime.now().year - self.birth_year

person = Person(1990)
print(person.age)  # Can read
# person.age = 30  # Error! Read-only

Best Practices

  • Use for computed values: Properties that depend on other attributes
  • Add validation: Use setters to validate input
  • Keep simple: Don't put heavy computation in properties
  • Document properties: Add docstrings

Next Steps

Learn about decorators and dunder methods.