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.