2011-02-20 15 views
12
  • पाइथन में __slots__ लागू किया गया है?
  • क्या यह C interface में उजागर हुआ है?
  • के माध्यम से सी में पाइथन कक्षा को परिभाषित करते समय मुझे __slots__ व्यवहार कैसे प्राप्त हो सकता है?
+0

कर सकते है, और यह काफी बस "वस्तु एक __slots__ विशेषता है, एक __dict__ का निर्माण नहीं करतीं का एक सवाल है।। :-) क्या आप सी इंटरफ़ेस से '__slots__' विशेषता को असाइन करते हैं जैसे कि आप एक .py फ़ाइल में होंगे? –

+0

@ डेविड हेफ़र्नन: केवल गैर-विरासत प्रणाली पर;; ' –

उत्तर

17

पायथन कक्षाएं बनाते समय, वे डिफ़ॉल्ट रूप से __dict__ रखते हैं और आप उन पर कोई विशेषता सेट कर सकते हैं। स्लॉट का बिंदु अंतरिक्ष बचाने के लिए __dict__ नहीं बनाना है।

सी इंटरफ़ेस में यह दूसरी तरह के आसपास, एक विस्तार वर्ग डिफ़ॉल्ट कोई __dict__ से है, और आप के बजाय स्पष्ट रूप से एक जोड़ सकते हैं और इसे संभाल करने के लिए getattr/setattr समर्थन जोड़ने (हालांकि सौभाग्य से वहाँ इस के लिए तरीकों को पहले से ही कर रहे हैं करने के लिए होगा , PyObject_GenericGetAttr और PyObject_GenericSetAttr, इसलिए आपको उन्हें लागू करने की आवश्यकता नहीं है, बस उनका उपयोग करें। (मजेदार है कि PyObject_GenericDelAttr नहीं है, हालांकि, मुझे यकीन नहीं है कि यह क्या है। (मुझे शायद इस तरह घोंसले कोष्ठक को रोकना चाहिए (या नहीं))))।

इसलिए स्लॉट की आवश्यकता नहीं है और न ही एक्सटेंशन प्रकारों के लिए समझ में आता है। डिफ़ॉल्ट रूप से आप बस अपने getattr/setatttr विधियों को कक्षा के उन विशेषताओं तक पहुंचने दें।

का सवाल है कि यह कैसे लागू हो जाता है, कोड typeobject.c में काफी unexciting

+0

PyObject_GenericDelAttr = PyObject_GenericSetAttr एक पूर्ण मान तर्क के साथ – ncoghlan

+3

हू, सी एपीआई दस्तावेज़ वास्तव में इस तथ्य को दस्तावेज करने पर ढीले हैं कि tp_setattr और tp_setattro विधियों को हटाने को संभालने के लिए भी माना जाता है। हमें शायद इसके बारे में कुछ करना चाहिए ... – ncoghlan

+1

F या __slots__ को कार्यान्वित करने के तरीके के बारे में अधिक जानकारी, http://code.activestate.com/recipes/532903-how-__slots__-are-implemented/ पर पाइथन निकट समकक्ष पर देखने लायक है। – joeln

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