Trong Python, mọi thứ đều là đối tượng. Mọi đối tượng đều có attributes (thuộc tính) và methods (phương thức).
Attribute (Thuộc tính)
- Truy cập trực tiếp:
obj.attr - Không có logic xử lý khi get/set.
name, age, height...
Property (Thuộc tính tính toán)
Là attribute đặc biệt có getter, setter, deleter (phương thức __get__, __set__, __delete__). Khi truy cập obj.prop, Python kiểm tra xem prop có phải descriptor không (có các phương thức trên). Nếu có, gọi phương thức tương ứng thay vì trả về giá trị thô.
Decorator @property (Cách hiện đại)
class C:
def __init__(self):
self._x = None # Attribute nội bộ (convention: _prefix)
@property
def x(self):
"""I'm the 'x' property."""
return self._x # Getter
@x.setter
def x(self, value):
self._x = value # Setter
@x.deleter
def x(self):
del self._x # Deleter
obj = C()
obj.x = 10 # Gọi setter
print(obj.x) # Gọi getter -> 10
del obj.x # Gọi deleter
Tóm tắt khác biệt
| Đặc điểm | Attribute | Property |
|---|---|---|
| Lưu trữ | Giá trị trực tiếp | Tính toán khi truy cập |
| Logic get/set | Không có | Tùy chỉnh (validation, lazy load...) |
| Cú pháp | self.attr = val | @property + decorator |
| Hiệu năng | Nhanh | Chậm hơn (gọi hàm) |
Khi nào dùng property? Cần validation, computed value, lazy loading, hoặc thay đổi internal representation mà không phá vỡ API.