2013-05-23 4 views
6

मैंने इसके बारे में कुछ करने का प्रयास किया। गैर-डेटा वर्णक पुराने शैली के वर्गों के साथ क्यों काम करते हैं?पुरानी शैली के वर्गों के साथ पायथन डिस्क्रिप्टर

डॉक्स कहते हैं कि उन्हें नहीं होना चाहिए:
"Note that descriptors are only invoked for new style objects or classes (ones that subclass object() or type())."।

class Descriptor(object): 
    def __init__(self): 
     self.x = 1 

    def __get__(self, obj, cls=None): 
     return self.x 


class A: 
    x = Descriptor() 

a = A() 
a.x 

>>> 1 

धन्यवाद।

+0

क्योंकि 'वर्णनकर्ता' एक नई शैली की कक्षा है। – martineau

उत्तर

4

आप दस्तावेज़ों पर सवाल करने का अधिकार हैं। मैंने स्पष्टीकरण खोजने के लिए 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 दायर किया है।

+0

जांच के लिए धन्यवाद, यह वास्तव में सहायक है। – alexvassel

+0

मैंने सीपीथॉन में एक डिबगिंग सत्र के बाद अपना जवाब संपादित किया: मेरे पास गलत कार्य शामिल थे, लेकिन परिणाम वही रहता है। – icecrime

+0

ग्रेट जॉब, धन्यवाद फिर से) – alexvassel

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