เมื่อเร็ว ๆ นี้ฉันได้อ่านฐานรหัสที่มีอยู่ซึ่งมีคลาสมากมายที่แอตทริบิวต์ของอินสแตนซ์แสดงถึงค่าที่เก็บไว้ในฐานข้อมูล ฉันได้ปรับโครงสร้างใหม่จำนวนมากเพื่อให้การค้นหาฐานข้อมูลถูกเลื่อนออกไปเช่น ไม่ได้เริ่มต้นในตัวสร้าง แต่เมื่ออ่านครั้งแรกเท่านั้น แอตทริบิวต์เหล่านี้จะไม่เปลี่ยนแปลงตลอดอายุการใช้งานของอินสแตนซ์ แต่เป็นคอขวดที่แท้จริงในการคำนวณครั้งแรกและเข้าถึงได้เฉพาะกรณีพิเศษเท่านั้น ดังนั้นจึงสามารถแคชได้หลังจากที่ดึงข้อมูลจากฐานข้อมูลแล้ว (ดังนั้นจึงเหมาะกับคำจำกัดความของบันทึกช่วยจำโดยที่อินพุตเป็นเพียง "ไม่มีอินพุต")
ฉันพบว่าตัวเองกำลังพิมพ์ข้อมูลโค้ดต่อไปนี้ซ้ำแล้วซ้ำอีกสำหรับแอตทริบิวต์ต่างๆในคลาสต่างๆ:
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
มีมัณฑนากรที่ทำสิ่งนี้แล้วใน Python ที่ฉันไม่รู้หรือไม่? หรือมีวิธีง่ายๆในการกำหนดมัณฑนากรที่ทำสิ่งนี้หรือไม่?
ฉันทำงานภายใต้ Python 2.5 แต่ 2.6 คำตอบอาจยังน่าสนใจหากมีความแตกต่างอย่างมีนัยสำคัญ
บันทึก
คำถามนี้ถูกถามก่อนที่ Python จะรวมมัณฑนากรสำเร็จรูปไว้มากมายสำหรับสิ่งนี้ ฉันได้อัปเดตเพื่อแก้ไขคำศัพท์เท่านั้น
functools.lru_cache()ที่หนึ่ง: