कंस्ट्रक्टरों को वास्तव में "कंस्ट्रक्टर्स" क्यों कहा जाता है?
कंस्ट्रक्टर (नामित __new__) वर्ग का एक नया उदाहरण बनाता है और लौटाता है। तो C.__new__क्लास विधि क्लास सी के लिए कंस्ट्रक्टर है ।
C.__init__उदाहरण विधि एक विशिष्ट उदाहरण पर कहा जाता है, के बाद यह बनाया जाता है, फोन करने वाले के लिए वापस पारित किया जा रहा से पहले ही आरंभ करने के लिए। तो वह विधि C के नए उदाहरणों के लिए आरंभिक है।
वे कक्षा में विधियों से कैसे भिन्न हैं?
जैसा कि आधिकारिक दस्तावेज __init__ में कहा गया है कि उदाहरण निर्मित होने के बाद कहा जाता है । अन्य विधियाँ इस उपचार को प्राप्त नहीं करती हैं।
उनका उद्देश्य क्या है?
कंस्ट्रक्टर C.__new__का उद्देश्य नए Cउदाहरण के निर्माण के दौरान कस्टम व्यवहार को परिभाषित करना है ।
आरम्भ करने वाले का उद्देश्य इसके बनने C.__init__के Cबाद के प्रत्येक उदाहरण के कस्टम इनिशियलाइज़ेशन को परिभाषित करना है।
उदाहरण के लिए अजगर आपको करने की अनुमति देता है:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
लेकिन अगर आप चाहते हैं कि हर उदाहरण में 10 के बराबर Testविशेषता हो x, तो आप उस कोड को अंदर रख सकते हैं __init__:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
प्रत्येक आवृत्ति विधि (किसी वर्ग के विशिष्ट उदाहरण पर कॉल की गई विधि) को इसके पहले तर्क के रूप में आवृत्ति प्राप्त होती है। उस तर्क को पारंपरिक नाम दिया गया है self।
क्लास मेथड्स, जैसे कंस्ट्रक्टर __new__, क्लास को उनके पहले तर्क के रूप में प्राप्त करते हैं।
अब, यदि आप उस xविशेषता के लिए कस्टम मान चाहते हैं जो आपको करना है तो उस मान को तर्क के रूप में पास करें __init__:
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
मुझे आशा है कि यह आपको कुछ संदेह को दूर करने में मदद करेगा, और जब से आप पहले से ही अन्य सवालों के अच्छे जवाब प्राप्त कर चुके हैं, मैं यहाँ रुकूंगा :)
__init__एक प्रारंभिक है । अजगर कंस्ट्रक्टर है__new__। पायथन स्वचालित दो-चरण के आरंभीकरण का उपयोग करता है -__new__एक वैध लेकिन (आमतौर पर) अनपॉप किए गए ऑब्जेक्ट (boolएक काउंटर-उदाहरण के लिए देखें) देता है, जो तब__init__स्वचालित रूप से इस पर कॉल करता है। यह उन समस्याओं से बचा जाता है जैसे C ++ में आंशिक रूप से निर्मित वस्तुओं के साथ भाषाएं होती हैं - आपके पास पायथन में कभी भी एक नहीं होता (हालांकि यह आंशिक रूप से प्रारंभिक हो सकता है)। आपको लगभग कभी भी दोनों को__new__और__init__एक वर्ग को ओवरराइड करने की आवश्यकता नहीं होगी ।