2015-05-17 9 views
7

मेरे पास एक कक्षा है जो __getattr__ का उपयोग करके आभासी विशेषताओं को लागू करती है। गुण महंगा हो सकते हैं, उदा। एक प्रश्न प्रदर्शन अब, मैं एक लाइब्रेरी का उपयोग कर रहा हूं जो जांचता है कि वास्तव में इसे प्राप्त करने से पहले मेरे ऑब्जेक्ट में विशेषता है या नहीं।विशेषता मूल्य को पुनः प्राप्त करने से हैशर को कैसे रोकें

परिणामस्वरूप, एक प्रश्न के बजाय दो बार निष्पादित किया जाता है। बेशक यह वास्तव में यह जानने के लिए __getattr__ निष्पादित करने के लिए समझ में आता है कि विशेषता मौजूद है या नहीं।

class C(object): 
    def __getattr__(self, name): 
     print "I was accessed" 
     return 'ok' 

c = C() 
hasattr(c, 'hello') 

क्या इसे रोकने के लिए कोई तरीका है?

यदि पायथन __hasattr__ का समर्थन करता है तो मैं बस जांच सकता हूं कि क्वेरी मौजूद है या नहीं, वास्तव में इसे चलाने का विरोध किया है।

मैं एक कैश बना सकता हूं, लेकिन यह भारी है क्योंकि एक क्वेरी में पैरामीटर हो सकते हैं। बेशक, सर्वर स्वयं प्रश्नों को कैश कर सकता है और समस्या को कम कर सकता है, लेकिन यदि क्वेरी बहुत सारे डेटा लौटाती है तो यह अभी भी भारी है।

कोई विचार?

+0

यदि मैं स्थिति को सही समझता हूं, तो आपको केवल 'नाम' के आधार पर कैश करने की आवश्यकता है, ताकि यह केवल एक शब्दकोश हो। बीटीडब्ल्यू, आप इसे एक विशेषता की तरह क्यों दिखाना चाहते हैं? – bereal

+0

यदि ऑब्जेक्ट क्वेरी का समर्थन नहीं करता है तो आप क्या करना चाहते हैं? – Shashank

+0

'हैशट' एक विशेषता के लिए हल्के वजन परीक्षण नहीं है; यह 'getattr' को अनिवार्य रूप से 'try: getattr (' name ') की तरह कहते हैं; विशेषताएँ को छोड़कर: झूठी वापसी; अन्य: सही वापस लौटें। – chepner

उत्तर

0

मुझे लगता है कि यह आमतौर पर शायद एक खराब पैटर्न है, लेकिन आप हमेशा किसी ऑब्जेक्ट के अंतर्निहित __dict__ की जांच कर सकते हैं।

In [1]: class A(object): 
    ....:  @property 
    ....:  def wha(self): 
    ....:   print "was accessed" 
    ....: 

In [2]: A.__dict__ 
Out[2]: 
<dictproxy {'__dict__': <attribute '__dict__' of 'A' objects>, 
'__doc__': None, 
'__module__': '__main__', 
'__weakref__': <attribute '__weakref__' of 'A' objects>, 
'wha': <property at 0x10f6b11b0>}> 

In [3]: a = A() 

In [4]: "wha" in a.__class__.__dict__ 
Out[4]: True 
+2

मुझे लगता है कि ओपी एक थर्ड-पार्टी लाइब्रेरी से निपट रहा है जो 'हैट्टर' कहता है, इसलिए इसे लाइब्रेरी को फोर्क करने की आवश्यकता होगी। – bjudson

+0

मुझे लगता है कि आप गलत समझते हैं, कक्षा ठीक है, और मुझे __getattr __() का उपयोग करने की आवश्यकता है। इसके अलावा @bjudson क्या कहा। – koriander

3

हालांकि शुरू में मैं एक "बुरा विचार" सामान्य रूप में किया जा रहा है बंदर पैचिंग के विचार के शौकीन नहीं था,, मैं 1999 से एक बहुत साफ समाधान में आए !!

http://code.activestate.com/lists/python-list/14972/

def hasattr(o, a, orig_hasattr=hasattr): 
    if orig_hasattr(o, "__hasattr__"): 
     return o.__hasattr__(a) 
    return orig_hasattr(o, a) 

__builtins__.hasattr = hasattr 

मूलतः यह अजगर है, जो है जो मैं मूल रूप से सोचा था कि इष्टतम समाधान होगा में __hasattr__ के लिए समर्थन पैदा करता है।

+1

** बंदर पैचिंग भयानक है। ** रूबीवादियों ने लंबे समय तक बदसूरत बंदर को गले लगा लिया है। तो Pythonistas चाहिए। '__hasattr __()' विशेष तरीकों का समर्थन करने के लिए निर्मित 'हैशर() 'बिल्टिन का आपका विस्तार उस का एक आदर्श उदाहरण है। इस सुरुचिपूर्ण हैकरी को फिर से जीवंत करने के लिए धन्यवाद! –

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

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