A property gives callers attribute syntax while a method controls the value. That makes a setter useful when every assignment must preserve a rule, such as keeping a room capacity nonnegative. Validate before storing the new value so a failed assignment leaves the object usable.
Computed properties solve a different problem: they derive a value from current state and avoid stale copies. You will also use slots to reject misspelled field names and see why object ownership matters. Slots don't make values immutable, and they don't replace validation. Each cart still needs its own list. The checks include zero values, rejected writes, and several customers created in one operation.