Challenge 2: Rectangle with @property — Possible Solution ==================================================================== class Rectangle: def __init__(self, width, height): self.width = width self.height = height @property def area(self): return self.width * self.height r = Rectangle(5, 3) print(r.area) Output: 15 WHY THIS WORKS AS AN ANSWER ------------------------------ __init__(self, width, height) reuses the plain instance-attribute pattern from Course 2, Chapter 1 — self.width and self.height are stored directly, no computation involved yet. @property above def area(self): reuses the chapter's own Circle class example exactly — decorating a method with @property makes it accessible as r.area rather than r.area(), even though it's really running a small calculation (self.width * self.height) every time it's read, not just returning a stored value. Because area is never stored as its own instance attribute — it's computed fresh from self.width and self.height on every access — it can never drift out of sync with those two values the way a manually cached area = width * height field set once in __init__ could if width or height changed later. This is exactly the "value that's always derived from other attributes" use case the chapter's Circle example was built to demonstrate, just with multiplication instead of the circle-area formula.