2017-07-08 7 views
5

अजगर का वर्णन करता है:लुकअप प्रक्रियाओं में `__getattribute__` विधि कैसे शामिल है? संक्षेप में

कैसे __getattribute__ विधि से ऊपर देखने प्रक्रियाओं में शामिल है?

  • क्या __getattribute__ विधि लुकअप प्रक्रियाओं में कहीं भी कहा जाता है?

  • या, __getattribute__ पर कॉल करके लुकअप प्रक्रिया शुरू की गई है, जो तब दो लिंक में सभी काम करता है?

धन्यवाद।

+0

इन सभी विशेषता लुकअप प्रश्नों के साथ आप पूछ रहे हैं, मुझे लगा कि आप अंततः इस भाग के बारे में सुनना चाहते हैं। – user2357112

+0

[प्रासंगिक] (https://stackoverflow.com/questions/39043912/python-3-getattribute-vs-dot-access-behaviour), हालांकि आप जिन लोगों को देख रहे हैं उससे भिन्न विवरणों पर ध्यान केंद्रित करते हैं। – user2357112

उत्तर

2

टीएलडीआर: विशेषता लुकअप __getattribute__ पर कॉल करने के साथ शुरू होता है और यह लिंक में उल्लिखित सभी कार्य करता है। ऑब्जेक्ट के प्रकार के आधार पर object.__getattribute__ या type.__getattribute__ कहा जाता है। LOAD_ATTR बाईटकोड आंतरिक रूप में


कोई विशेषता देखने का परिणाम है।

>>> import dis  
>>> dis.dis(lambda: foo.x) 
    1   0 LOAD_GLOBAL    0 (foo) 
       2 LOAD_ATTR    1 (x) 
       4 RETURN_VALUE 

LOAD_ATTR तो PyObject_GetAttr कहता है।

PyObject_GetAttr अब ऑब्जेक्ट के प्रकार पर tp_getattro या tp_getattr(deprecated) स्लॉट की तलाश में है।

PyObject * 

PyObject_GetAttr(PyObject *v, PyObject *name) 
{ 
    PyTypeObject *tp = Py_TYPE(v); 
    ... 
    if (tp->tp_getattro != NULL) 
     return (*tp->tp_getattro)(v, name); 
    if (tp->tp_getattr != NULL) { 
     const char *name_str = PyUnicode_AsUTF8(name); 
     if (name_str == NULL) 
      return NULL; 
     return (*tp->tp_getattr)(v, (char *)name_str); 
    } 
    ... 
} 

अब एक वस्तु __getattribute__ के अपने स्वयं के कार्यान्वयन है तो फिर कि और प्रयोग किया जाता है यह या तो object.__getattribute__ या type.__getattribute__ प्रकार के आधार पर करने के लिए वापस गिर जाता है। tp_getattro slotobject अंक PyObject_GenericGetAttr और type के मामले में यह type_getattro पर इंगित करता है।

PyObject_GenericGetAttr और type_getattro मूल रूप से वर्णनकर्ताओं, शब्दकोश, स्लॉट इत्यादि (प्रकार के आधार पर) के लिए जांच करने के सभी काम करते हैं और एक मूल्य वापस करने का प्रयास करते हैं। अगर वे सबकुछ के बाद भी इसे खोजने में असफल होते हैं तो AttributeError उठाया जाता है और यदि ऑब्जेक्ट के प्रकार को __getattr__ परिभाषित किया जाता है तो इसे लागू किया जाएगा।

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