2016-08-30 11 views
10

मैं पाइथन ऑब्जेक्ट मॉडल पर a presentation पढ़ रहा था, जब एक स्लाइड (संख्या 9) में, लेखक ने दावा किया कि पायथन के कार्य वर्णनकर्ता हैं। ,फ़ंक्शन डिस्क्रिप्टर कैसे काम करते हैं?

def mul(x, y): 
    return x * y 

mul2 = mul.__get__(2) 
mul2(3) # 6 

अब, मैं समझता हूँ कि बिंदु बना है समारोह को परिभाषित करता है के बाद से एक __get__ यह की जानकारी देता है के रूप में मैं का वर्णन खंड में वर्णित है: उदाहरण के वह वर्णन करने के लिए प्रस्तुत करता है यह एक मैंने लिखा के समान है पायथन दस्तावेज।

मुझे समझ में नहीं आता कि आउटपुट में कॉल परिणाम वास्तव में कैसा है।

उत्तर

12

वह पाइथन कक्षाओं में गतिशील रूप से कार्यों को जोड़ने के लिए क्या करता है यह कर रहा है।

__get__ एक समारोह वस्तु (आमतौर पर डॉट पहुँच . के माध्यम से किया एक वर्ग का एक उदाहरण पर) अजगर एक विधि और परोक्ष उदाहरण (आमतौर पर self रूप में मान्यता प्राप्त) पारित करने के लिए समारोह को बदलने के रूप में पर लागू किया जाता है तो पहला तर्क

>>> mul2 
<bound method mul of 2> 
: स्पष्ट रूप से कॉल __get__ और स्पष्ट 'उदाहरण' 2 जो समारोह x के पहले तर्क के रूप में ही है गुजरती हैं, यहाँ 2 "उदाहरण" self माना जाता है

आपके मामले में, आप

इसका परिणाम उदाहरण 2 पर एक विधि में होता है, जिसमें एक अपेक्षित तर्क होता है जो गुणा उत्पन्न करता है: इसे 2 (x पर निर्दिष्ट बाध्य तर्क) को किसी भी प्रकार से गुणा किया जाता है अन्यथा आप तर्क y के रूप में आपूर्ति करते हैं।

आम तौर पर, function() invokes यह प्रदान की उचित तर्क के साथ __call__ है:

mul.__call__(2, 3) # 6 

एक प्लस, कार्यों के लिए __get__ की एक अजगर कार्यान्वयन के रूप में अजगर डॉक्स के Descriptor HOWTO दस्तावेज़ में प्रदान की जाती है।

यहाँ आप types.MethodType का उपयोग, कि तब होता है जब __get__ शुरू हो जाती है साथ परिवर्तन देख सकते हैं,:

class Function(object): 
    . . . 
    def __get__(self, obj, objtype=None): 
     "Simulate func_descr_get() in Objects/funcobject.c" 
     return types.MethodType(self, obj, objtype) 

और intrigued आगंतुक के लिए स्रोत कोड Objects/funcobject.c में स्थित है।

अगर यह वर्णनकर्ता मौजूद नहीं था आप स्वचालित रूप से types.MethodType में किसी भी समय आप गतिशील रूप से वर्ग के लिए एक समारोह जो एक अनावश्यक परेशानी है जोड़ सकते हैं, कार्यों रैप करने के लिए होगा आप देख सकते हैं।

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