2015-04-28 4 views
6

कहें कि आपके पास निम्नलिखित सजावट है। इसे सजाने वाले सभी कार्यों के लिए कुछ सूची संदर्भों में शामिल होने के लिए संशोधित कैसे किया जा सकता है?एक सजावट के भीतर पंजीकरण कैसे करें यह सभी कार्यों को सजाने के लिए?

def memoize(obj): 
    cache = obj.cache = {} 

    @functools.wraps(obj) 
    def memoizer(*args, **kwargs): 
     if args not in cache: 
      cache[args] = obj(*args, **kwargs) 
     return cache[args] 
    return memoizer 

@memoize 
def foo(bar): 
    return bar ** 3 
+0

क्या आपको परवाह है कि "कुछ सूची" संग्रहित की जाती है? क्या आप चाहते हैं कि यह वैश्विक वैरिएबल हो या किसी भी तरह सजावटी से जुड़ा हुआ हो? – BrenBarn

+3

इसे किसी विधि के बजाय कक्षा बनाते हैं ... फिर प्रत्येक ओबीजे को '__init__' –

+0

@BrenBarn पर जोड़ने के लिए स्थिर चर का उपयोग करें, मुझे वास्तव में परवाह नहीं है कि सूची कहां संग्रहीत की जाती है। –

उत्तर

3

आप आसानी से एक (memoize.decorated) डेकोरेटर-समारोह वस्तु पर सूची स्टोर कर सकते हैं:

_decorated = [] 

def memoize(obj): 
    cache = obj.cache = {} 

    # add to the decorated list 
    _decorated.append(obj) 

    @functools.wraps(obj) 
    def memoizer(*args, **kwargs): 
     if args not in cache: 
      cache[args] = obj(*args, **kwargs) 
     return cache[args] 
    return memoizer 

# make the list accessible from the decorator: 
memoize.decorated = _decorated 

यह की तरह इस्तेमाल किया जा सकता है:

@memoize 
def foo(bar): 
    return bar ** 3 

print memoize.decorated 

एक तरफ ध्यान दें के रूप में, आपको चाहिए WeakRefs in the list को संग्रहीत करने पर विचार करें, स्मृति रिसाव से बचने के लिए या वस्तुओं को मुक्त नहीं किया जा रहा है जब उनके लिए कोई अन्य "असली" संदर्भ शेष नहीं है।

+2

कि सराहना करेंगे शुरुआत में उपयोग करते हुए '__' में काम का एक सा अधिक विस्तृत विवरण प्रदान कर सकते हैं और नाम के सिरों है मैं सज्जाकार के साथ एक सा नया हूँ निराश, क्योंकि उनको केवल पायथन आंतरिक के लिए माना जाता है। यहाँ एक अग्रणी '__' का उपयोग करने का कोई वास्तविक कारण नहीं है। (मैं कहूंगा कि एक भी अंडरस्कोर का उपयोग करने के लिए बहुत अधिक कारण नहीं है, लेकिन यह अधिक बहस योग्य है।) – BrenBarn

+0

@ ब्रेनबर्न सहमत हुए, मैंने नामकरण तय किया – shx2

संबंधित मुद्दे