2013-03-19 5 views
11
import inspect 

class Foo(object): 
    pass 

if __name__ == '__main__': 
    print type(Foo.__init__) 
    print inspect.getsourcelines(Foo.__init__) 

आउटपुट:रैपर_डिस्क्रिप्टर क्या है, और इस मामले में Foo .__ init __() क्यों है?

<type 'wrapper_descriptor'> 
Traceback (most recent call last): 
    *snip* 
    File "/usr/lib/python2.7/inspect.py", line 420, in getfile 
    'function, traceback, frame, or code object'.format(object)) 
TypeError: <slot wrapper '__init__' of 'object' objects> is not a module, class, method, function, traceback, frame, or code object 

Googling क्या, वास्तव में, एक wrapper_descriptor है के बारे में बहुत कम उपयोगी जानकारी है, और क्यों एक खाली कक्षा एक __init__ विधि है कि एक विधि नहीं है, बल्कि एक wrapper_descriptor देता है।

यहां वास्तव में क्या चल रहा है? __init__ विधियों के बिना सभी कक्षाएं इन wrapper_descriptor चीजों में से एक है? कक्षा के निर्देश में __init__ क्यों है?

उत्तर

6

जो आपने चलाया है वह कार्यान्वयन विस्तार है। यह सी में लागू कक्षाओं के लिए काफी विशिष्ट है, object है। यह एक पायथन विधि नहीं है, यह एक सी विधि है, और रैपर इस इंटरफ़ेस का हिस्सा है।

कक्षा के निर्देश में __init__ क्यों है?

यह कक्षा के निर्देश में नहीं है, यह object dict में है। object में __init__ है ताकि जब आप super() का उपयोग करके अपनी कक्षा के बेस क्लास '__init__ विधियों को कॉल करने का प्रयास करें, तो यह असफल नहीं होता है।

+0

सी एपीआई दस्तावेज इसके अलावा कुछ विवरण बताता है, यदि आप परवाह करते हैं। लेकिन आम तौर पर आप इस तथ्य से परे परवाह नहीं करते हैं कि "स्लॉट रैपर", "विधि-रैपर", और इसी तरह की चीजें हैं जिन्हें आप कॉल कर सकते हैं जैसे कि वे बाध्य तरीके, अनबाउंड विधियां इत्यादि थे, लेकिन कोई पाइथन नहीं है सोर्स कोड। – abarnert

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