आप दस्तावेज़ों पर सवाल करने का अधिकार हैं। मैंने स्पष्टीकरण खोजने के लिए CPython sources के माध्यम से देखने का प्रयास किया है, लेकिन चेतावनी दीजिये: मैं कोई विशेषज्ञ नहीं हूं।
मेरी समझ से, देखने और वर्णनकर्ता विशेषता __get__
मंगलाचरण instance_getattr2
(चुना अर्क) में होता है:
v = class_lookup(inst->in_class, name, &klass);
if (v != NULL) {
f = TP_DESCR_GET(v->ob_type);
if (f != NULL) {
PyObject *w = f(v, (PyObject *)inst, (PyObject *)(inst->in_class));
}
}
तो या तो मैं कुछ, या कार्यान्वयन में कुछ भी नहीं याद आ रही है जो विपरीत एक नई शैली वस्तु की आवश्यकता है (दस्तावेज़ीकरण)।
रिकॉर्ड के लिए, मैंने पाइथन को नई स्टाइल क्लास ऑब्जेक्ट्स में डिस्क्रिप्टर आमंत्रण को प्रतिबंधित करने की कोशिश की, लेकिन यह वास्तव में एक विशाल गड़बड़ी लाया। मैंने इस प्रक्रिया में सीखा है कि वर्ग विधियों को स्वयं वर्णनकर्ताओं के रूप में लागू किया गया है: यह तंत्र उपयोग के आधार पर बाध्य या अनबाउंड विधि वस्तुओं को वापस करने के लिए उपयोग किया जाता है। उदाहरण के लिए:
>>> class A:
... def foo():
... pass
...
>>> A.foo.__get__(None, A)
<unbound method A.foo>
>>> A.foo.__get__(A(), A)
<bound method A.foo of <__main__.A instance at 0x000000000229CC48>>
नतीजतन, ऐसा लगता है कि पुरानी शैली वस्तुओं या वर्गों के गुण भी विधि के लिए रोका जा सके वर्णनकर्ता मंगलाचरण को रोकने के लिए उन्हें पर कहता है, कम से कम CPython कार्यान्वयन के साथ।
एक बार फिर, मैं कोई विशेषज्ञ नहीं हूं और यह पहली बार है जब मैं पायथन कार्यान्वयन में कूदता हूं, इसलिए मैं बहुत गलत हो सकता था। मैंने इसे स्पष्ट करने के लिए an issue दायर किया है।
क्योंकि 'वर्णनकर्ता' एक नई शैली की कक्षा है। – martineau