Gần đây, tôi đã xem qua một cơ sở mã hiện có chứa nhiều lớp trong đó các thuộc tính phiên bản phản ánh các giá trị được lưu trữ trong cơ sở dữ liệu. Tôi đã cấu trúc lại rất nhiều thuộc tính này để hoãn việc tra cứu cơ sở dữ liệu của chúng, tức là. không được khởi tạo trong hàm tạo mà chỉ được khởi tạo khi đọc lần đầu. Các thuộc tính này không thay đổi trong suốt thời gian tồn tại của phiên bản, nhưng chúng là một nút thắt cổ chai thực sự để tính toán lần đầu tiên đó và chỉ thực sự được truy cập cho các trường hợp đặc biệt. Do đó, chúng cũng có thể được lưu vào bộ nhớ đệm sau khi chúng được truy xuất từ cơ sở dữ liệu (do đó, điều này phù hợp với định nghĩa về memoisation trong đó đầu vào chỉ đơn giản là "không có đầu vào").
Tôi thấy mình đang gõ đoạn mã sau nhiều lần cho các thuộc tính khác nhau trên các lớp khác nhau:
class testA(object):
def __init__(self):
self._a = None
self._b = None
@property
def a(self):
if self._a is None:
# Calculate the attribute now
self._a = 7
return self._a
@property
def b(self):
#etc
Có một trình trang trí hiện có để thực hiện điều này bằng Python mà tôi đơn giản là không biết không? Hoặc, có một cách hợp lý đơn giản để xác định một người trang trí thực hiện điều này?
Tôi đang làm việc theo Python 2.5, nhưng các câu trả lời 2.6 vẫn có thể thú vị nếu chúng khác nhau đáng kể.
Ghi chú
Câu hỏi này đã được đặt ra trước khi Python bao gồm rất nhiều trình trang trí sẵn sàng cho việc này. Tôi đã cập nhật nó chỉ để sửa thuật ngữ.
functools.lru_cache()
.