हाल ही में मैं एक मौजूदा कोड बेस से गुजरा हूं जिसमें कई वर्ग हैं, जहां एट्रिब्यूट्स एक डेटाबेस में संग्रहीत मूल्यों को दर्शाते हैं। मैंने इनमें से बहुत सारी विशेषताओं को अपने डेटाबेस लुकअप को स्थगित करने के लिए निरस्त कर दिया है, अर्थात। कंस्ट्रक्टर में इनिशियलाइज़ नहीं किया जाना चाहिए लेकिन केवल पहले पढ़ने पर। ये विशेषताएँ उदाहरण के जीवनकाल में नहीं बदलती हैं, लेकिन वे पहली बार गणना करने के लिए एक वास्तविक अड़चन हैं और केवल विशेष मामलों के लिए ही एक्सेस की जाती हैं। इसलिए उन्हें डेटाबेस से पुनर्प्राप्त किए जाने के बाद भी कैश किया जा सकता है (यह इसलिए मेमॉलेशन की परिभाषा फिट बैठता है जहां इनपुट बस "कोई इनपुट नहीं है")।
मैं अपने आप को विभिन्न वर्गों में विभिन्न विशेषताओं के लिए बार-बार कोड के निम्नलिखित स्निपेट टाइप करता हुआ पाता हूं:
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
क्या पायथन में पहले से ही ऐसा करने के लिए एक मौजूदा डेकोरेटर है जिससे मैं अनजान हूँ? या, एक डेकोरेटर को परिभाषित करने का एक बहुत सरल तरीका है जो ऐसा करता है?
मैं पायथन 2.5 के तहत काम कर रहा हूं, लेकिन अगर वे काफी अलग हैं, तो 2.6 जवाब अभी भी दिलचस्प हो सकते हैं।
ध्यान दें
पायथन से इसके लिए बहुत सारे तैयार किए गए डेकोरेटर शामिल हैं, इससे पहले यह सवाल पूछा गया था। मैंने इसे केवल शब्दावली सुधारने के लिए अद्यतन किया है।
functools.lru_cache():।