टीएलडीआर: विशेषता लुकअप __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__
परिभाषित किया जाता है तो इसे लागू किया जाएगा।
स्रोत
2017-07-08 22:06:29
इन सभी विशेषता लुकअप प्रश्नों के साथ आप पूछ रहे हैं, मुझे लगा कि आप अंततः इस भाग के बारे में सुनना चाहते हैं। – user2357112
[प्रासंगिक] (https://stackoverflow.com/questions/39043912/python-3-getattribute-vs-dot-access-behaviour), हालांकि आप जिन लोगों को देख रहे हैं उससे भिन्न विवरणों पर ध्यान केंद्रित करते हैं। – user2357112