2012-09-27 2 views
7

मैं नहीं समझ सकता क्या नीचे पूर्वता करता __getattribute__() विशेष विधि और Descriptorsवर्णनकर्ता: __getattribute के माध्यम से गुण के लिए उपयोग की Precendence() __

के संदर्भ में इसका मतलब है मैं किताब से topic("Precedence") - under topic ("Desriptors") के तहत इस पढ़ Core Python Programming 3 बार, अभी भी इसके माध्यम से नहीं जा सकता .. क्या कोई यह समझा सकता है कि ये प्राथमिकताएं क्या हैं, और कहां उपयोग की जाती है ??

  • कक्षा विशेषताओं
  • डाटा वर्णनकर्ता
  • उदाहरण विशेषताओं
  • गैर डेटा वर्णनकर्ता
  • __getattr__()

करने को डिफ़ॉल्ट रूप से मैं भी python documentation, जहां मैं नीचे बयान पाया पढ़ें: -

उदाहरण के लिए बाइंडिंग, वर्णक आमंत्रण की प्राथमिकता पर निर्भर करता है जिस पर वर्णक विधियों को परिभाषित किया गया है। एक वर्णनकर्ता __get__(), __set__() और __delete__() के किसी भी संयोजन को परिभाषित कर सकता है। यदि यह __get__() को परिभाषित नहीं करता है, तो विशेषता तक पहुंचने से डिस्क्रिप्टर ऑब्जेक्ट स्वयं वापस आ जाएगा जब तक कि ऑब्जेक्ट के इंस्टेंस डिक्शनरी में कोई मान न हो। यदि वर्णनकर्ता __set__() और/या __delete__() परिभाषित करता है, तो यह एक डेटा वर्णनकर्ता है; यदि यह न तो परिभाषित करता है, तो यह एक गैर-डेटा वर्णनकर्ता है। आम तौर पर, डेटा डिस्क्रिप्टर __get__() और __set__() दोनों को परिभाषित करते हैं, जबकि गैर-डेटा वर्णनकर्ताओं के पास केवल __get__() विधि है।

**__set__()** और **__get__()** साथ

डाटा वर्णनकर्ता हमेशा एक उदाहरण शब्दकोश में एक नई परिभाषा ओवरराइड परिभाषित किया। इसके विपरीत, गैर-डेटा वर्णनकर्ताओं द्वारा उदाहरणों को ओवरराइड किया जा सकता है।

अजगर विधियों (staticmethod() और classmethod() सहित) गैर डेटा वर्णनकर्ता के रूप में लागू कर रहे हैं। तदनुसार, उदाहरण विधियों को फिर से परिभाषित और ओवरराइड कर सकते हैं। यह अलग-अलग उदाहरणों को प्राप्त करने की अनुमति देता है जो समान वर्ग के अन्य उदाहरणों से भिन्न व्यवहार प्राप्त करते हैं।

क्या कोई भी यह बताने के लिए एक छोटा सा उदाहरण दे सकता है कि first paragraph क्या है? यह भी कहकर इसका मतलब है - override a redefinition in an instance dictionary ??

+0

संबंधित: [कौन सा पायथन भाषा नियम वर्णनकर्ता को पहले पाया जा सकता है?] (Http://stackoverflow.com/questions/1865902/), [वर्णनकर्ता और पायथन-प्रदत्त विशेषताओं] (http://stackoverflow.com/प्रश्न/10536539 /) –

+0

@PiotrDobrogost .. उन लिंक के लिए धन्यवाद पियेटर .. :) –

उत्तर

4

मान लीजिए आप एक वर्ग है:

class C(object): 
    dd = MyDataDescriptor() 
    ndd = MyNonDataDescriptor() 
    def __init__(self): 
     self.__value = 1 

के डेटा वर्णनकर्ता में पहली नजर डालते हैं। अपने कोड में यदि आप कार्य करें:

cobj = C() 
cobj.dd 

उपरोक्त अनुच्छेद के अनुसार, cobj.__dict__ वस्तु हमेशा ओवरराइड जब dd विशेषता एक्सेस किया जाता है, यानी वर्णनकर्ता वस्तु की __get__/__set__/__del__ तरीकों हमेशा के बजाय इस्तेमाल किया जाएगा हो जाएगा शब्दकोश।एकमात्र अपवाद तब होता है जब वर्णनकर्ता ऑब्जेक्ट __get__ विधि को परिभाषित नहीं करता है। फिर cobj.__dict__ ऑब्जेक्ट में dd कुंजी है तो ऑब्जेक्ट का मूल्य पढ़ा जाएगा, अगर वर्णनकर्ता ऑब्जेक्ट स्वयं वापस नहीं किया जाएगा।

अब गैर-डेटा वर्णनकर्ताओं के लिए। यदि आपका कोड में आप कॉल:

cobj.ndd = 2 

तो cobj.__dict__खाल गैर डेटा वर्णनकर्ता और ndd विशेषता हमेशा cobj.__dict__ वस्तु से पढ़ा जाता है। तो अगर आप कार्य करें:

cobj.ndd 

डिस्क्रिप्टर का __get__ विधि कहा जाता है नहीं किया जाएगा। लेकिन तुम शब्दकोश से विशेषता हटाते हैं:

del cobj.ndd 

तो वर्णनकर्ता वापस आ गया है, तो बुला

cobj.ndd 

वर्णनकर्ता पर __get__ विधि कॉल करेंगे।

+0

इस तरह के एक अच्छा और विस्तृत स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। .. मेरे सभी संदेह अब स्पष्ट हैं .. फिर से धन्यवाद :) –

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