जावा और सी ++ की आवश्यकता है कि एक आधार वर्ग निर्माता स्मृति लेआउट की वजह से कहा जाता है।
यदि आपके पास एक BaseClass
सदस्य के साथ एक वर्ग है field1
, और आप एक नया वर्ग बनाते SubClass
हैं जो एक सदस्य जोड़ता है field2
, तो एक उदाहरण SubClass
जिसमें field1
और के लिए स्थान होता है field2
। आपको BaseClass
भरने के लिए एक कंस्ट्रक्टर की field1
आवश्यकता होती है, जब तक कि आपको BaseClass
अपने स्वयं के कंस्ट्रक्टरों में पुनरावृत्ति की आरम्भिक पुनरावृत्ति की आवश्यकता न हो । और अगर field1
निजी है, तो इनहेरिट करने वाली कक्षाएं आरंभ नहीं कर सकती हैंfield1
।
अजगर जावा या C ++ नहीं है। सभी उपयोगकर्ता-परिभाषित वर्गों के सभी उदाहरणों में समान 'आकार' होता है। वे मूल रूप से केवल शब्दकोष हैं जिनमें विशेषताएँ डाली जा सकती हैं। इससे पहले कि कोई आरंभीकरण किया गया है, सभी उपयोगकर्ता-परिभाषित वर्गों के सभी उदाहरण लगभग समान हैं ; वे केवल उन विशेषताओं को संग्रहीत करने के लिए स्थान हैं जो अभी तक संग्रहीत नहीं हैं।
तो यह पायथन सबक्लास के लिए इसका सही अर्थ है कि वह अपने बेस क्लास कंस्ट्रक्टर को न बुलाए। यह केवल विशेषताओं को जोड़ सकता है यदि वह चाहता था। पदानुक्रम में प्रत्येक वर्ग के लिए दिए गए फ़ील्ड के लिए कोई स्थान आरक्षित नहीं है, और किसी BaseClass
विधि से कोड द्वारा जोड़े गए विशेषता और किसी विधि से कोड द्वारा जोड़े गए विशेषता के बीच कोई अंतर नहीं है SubClass
।
अगर, जैसा कि आम है, SubClass
वास्तव में सभी BaseClass
अपने स्वयं के अनुकूलन करने के लिए जाने से पहले स्थापित होने वाले सभी आक्रमणकारियों को चाहते हैं, तो हाँ आप बस कॉल कर सकते हैं BaseClass.__init__()
(या उपयोग कर सकते हैं super
, लेकिन यह जटिल है और कभी-कभी इसकी अपनी समस्याएं हैं)। लेकिन आपके पास नहीं है। और आप इसे पहले, या बाद में, या विभिन्न तर्कों के साथ कर सकते हैं। नरक, अगर आप चाहते थे कि आप BaseClass.__init__
पूरी तरह से एक और विधि से कॉल कर सकते हैं __init__
; हो सकता है कि आपके पास कुछ विचित्र आलसी आरंभीकरण की बात हो।
पायथन चीजों को सरल रखकर इस लचीलेपन को प्राप्त करता है। आप एक ऐसी __init__
विधि लिखकर ऑब्जेक्ट को इनिशियलाइज़ करते हैं, जो एट्रीब्यूट सेट करती है self
। बस। यह बिल्कुल एक विधि की तरह व्यवहार करता है, क्योंकि यह बिल्कुल एक विधि है। पहले किए जाने वाली चीजों के बारे में कोई अन्य अजीब और अनूठे नियम नहीं हैं, या यदि आप अन्य चीजों को नहीं करते हैं तो चीजें अपने आप हो जाएंगी। एकमात्र उद्देश्य जिसे सेवा देना है, वह है प्रारंभिक गुण मानों को सेट करने के लिए ऑब्जेक्ट इनिशियलाइज़ेशन के दौरान निष्पादित करने के लिए एक हुक होना, और यह बस यही करता है। यदि आप चाहते हैं कि यह कुछ और करे, तो आप स्पष्ट रूप से अपने कोड में लिखें।
__init__
विधि को इनहेरिट करने के लिए डेकोरेटर लिख सकते हैं , और यहां तक कि शायद स्वचालित रूप से उपवर्गों को खोज सकते हैं और उन्हें सजा सकते हैं।