2011-05-25 5 views
13

संभव डुप्लिकेट:
Python (and Python C API): new versus initपायथन में एक निर्माता और प्रारंभकर्ता के बीच क्या अंतर है?

मैं कॉलेज में अभी हूँ और व्याख्याता दूसरे के स्थान पर मामले निर्माणकर्ता और initializers का उपयोग कर रहा था। मुझे पूरा यकीन है कि यह गलत है हालांकि।

मैंने उत्तर को गुगल करने का प्रयास किया है लेकिन मुझे वह जवाब नहीं मिला है जिसे मैं ढूंढ रहा हूं।

+0

मुझे लगता है कि किसी ने "ऑफ-विषय" को बंद करने और हिट करते समय "सटीक डुप्लिकेट" बटन को याद किया .... :) –

उत्तर

19

अधिकांश ओओ भाषाओं में, वे एक ही कदम हैं, इसलिए वे जावा, सी ++ इत्यादि जैसी चीजों के लिए गलत नहीं हैं। पायथन में वे दो चरणों में किए जाते हैं: __new__ कन्स्ट्रक्टर है; __init__ प्रारंभकर्ता है।

Here एक और उत्तर है जो उनके बीच मतभेदों के बारे में अधिक जानकारी देता है।

+0

मैंने कभी देखा है इस विषय पर सबसे अच्छा जवाब। – user2372074

0

http://docs.python.org/reference/datamodel.html#basic-customization

__new__ - निर्माता।

__init__ - प्रारंभकर्ता।

+1

-1 वह पृष्ठ जिसे आपने लिंक किया है, constructinit__' को कन्स्ट्रक्टर के रूप में वर्णित करता है, जबकि '__init__' और' __new__' दोनों का उल्लेख करते हुए ** कन्स्ट्रक्टर अभिव्यक्ति ** को दिए गए तर्क प्राप्त करते हैं। यह कहीं भी "प्रारंभकर्ता" शब्द का उल्लेख नहीं करता है। – Ben

5

लगभग सभी सामान्य मामलों में, पाइथन में अन्य ओओ भाषाओं द्वारा उपयोग किए जाने वाले समान अर्थ में कन्स्ट्रक्टर नहीं होते हैं क्योंकि मैन्युअल रूप से स्मृति का प्रबंधन आमतौर पर निराश होता है। इसके बजाए, आपको आमतौर पर क्या करना चाहिए __ init __ कक्षा पर विधि परिभाषित करना है। इस विधि को नए इंस्टेंस ऑब्जेक्ट को स्वचालित रूप से प्रारंभ करने के लिए कहा जाता है, इसे बनाने के बाद पहली चीज़। इस प्रकार, यह वास्तव में एक निर्माता नहीं है, और इसके बारे में बात करने के रूप में एक निर्माता कुछ लोगों को भ्रमित कर सकता है।

बेशक कुछ लोग इसे एक कन्स्ट्रक्टर कहते हैं क्योंकि इसका उपयोग कन्स्ट्रक्टर की तरह थोड़ा सा किया जाता है - मूल रूप से आप जो कुछ भी चाहते हैं उसे कॉल कर सकते हैं जब तक कि हर कोई समझता है कि आप वास्तव में क्या कह रहे हैं। लेकिन सामान्य रूप से, स्पष्ट होने और स्वयं को समझने के लिए, इसे एक इनिट विधि या कन्स्ट्रक्टर के अलावा कुछ और कहें। मूल रूप से, अलग-अलग भाषाएं कुछ अलग शब्दावली के साथ आती हैं और बहुत स्पष्ट रूप से बोलने के लिए हमेशा आपके विषय और दर्शकों के समायोजन की आवश्यकता होती है।

पायथन में एक बेहतर ग्रैन्युलरिटी पर उदाहरण निर्माण और विनाश का प्रबंधन करना संभव है, हालांकि आप तब तक नहीं जानना चाहेंगे जब तक आप यह नहीं जानते कि आप क्या कर रहे हैं। यह नई __ __ और __ डेल __ तरीकों को परिभाषित वस्तु इन्स्टेन्शियशन और डेल बयान हुक करने द्वारा किया जाता है। चाहे ये रचनाकारों और विनाशकों के रूप में अर्हता प्राप्त करें, थोड़ा और अधिक बहस योग्य है (पायथन डॉक्स डेल विधि को विनाशक कहते हैं, लेकिन एक कन्स्ट्रक्टर का गठन करने पर योनि होने लगता है, उदाहरण के लिए ऑब्जेक्ट उदाहरणों को वापस करने वाले कई कार्यों सहित)। मैं अभी भी आपको भाषा के लिए विशिष्ट शब्दावली का उपयोग करने के लिए प्रोत्साहित करता हूं, और तुलनात्मक चर्चाओं में आपके शब्दों को आगे परिभाषित करने के लिए प्रोत्साहित करता हूं। हमेशा की तरह, बोलने के दौरान आपकी पसंद की पसंद में दर्शकों के बीच ट्रेडऑफ शामिल होते हैं जो आसानी से आप का पालन करने में सक्षम होते हैं और दर्शकों को संभावित रूप से भ्रम का कारण बनता है: यदि आप स्मृति प्रबंधन के बारे में बात कर रहे हैं तो संभवतः जितना संभव हो उतना सटीक हो, लेकिन यदि आप कमजोर बात कर रहे हैं तो बस कुछ शब्दों का उपयोग करें जो आपके दर्शकों को समझते हैं और स्पष्टीकरण के लिए तैयार हो जाते हैं।

आपका प्रशिक्षक सबसे बुरी तरह अस्पष्ट है, मुझे इन शर्तों की किसी भी कैनोलिक परिभाषा के बारे में पता नहीं है, लेकिन वे उन लोगों के लिए भ्रम पैदा कर सकते हैं जिन्होंने अन्य भाषाओं से बहुत विशिष्ट परिभाषाएं सीखी हैं।