2012-12-21 11 views
6

मैं DiveIntoPython माध्यम से जा रहा है और इस में आए किया गया था:पायथन में कोई कन्स्ट्रक्टर अधिभार नहीं - नुकसान?

जावा और PowerBuilder समर्थन समारोह तर्क सूची से अधिक भार, यानी एक वर्ग में एक ही नाम के साथ कई तरीकों लेकिन तर्कों की अलग नंबर, या तर्क हो सकता है विभिन्न प्रकार के। अन्य भाषाएं (सबसे विशेष रूप से पीएल/एसक्यूएल) तर्क नाम द्वारा फ़ंक्शन ओवरलोडिंग का भी समर्थन करती है; यानी एक वर्ग में नाम और उसी प्रकार के तर्कों की एक ही संख्या के साथ कई विधियां हो सकती हैं लेकिन अलग-अलग तर्क नाम। पाइथन इन में से कोई भी समर्थन नहीं करता है; इसमें फ़ंक्शन ओवरलोडिंग का कोई रूप नहीं है। विधियों को पूरी तरह से उनके नाम से परिभाषित किया गया है, और दिए गए नाम के साथ प्रति वर्ग केवल एक विधि हो सकती है। तो यदि किसी वंश वर्ग में __init__ विधि है, तो यह हमेशा पूर्वजों __init__ विधि को ओवरराइड करता है, भले ही वंशज इसे विभिन्न तर्क सूची के साथ परिभाषित करता हो। और एक ही नियम किसी अन्य विधि पर लागू होता है।

यह एक बड़ा नुकसान यह है कि एक उपवर्ग के __init__ विधि हमेशा एक सुपर क्लास के __init__ विधि को पार कर जाएगी नहीं है? तो अगर मैं कुछ चर आरंभ और एक वर्ग class1 में कुछ कार्यों बुला रहा हूँ रों चर और class2 के __init__ में उन कार्यों फोन के __init__, तो मैं एक उपवर्ग इसके बारे में class2(class1) निकाले जाते हैं, मैं class1 के सभी reinitialize करना होगा ' ?

मुझे पूरा यकीन है कि मैं यह सब गलत समझ रहा हूं, इसलिए अगर कोई इसे स्पष्ट करता है तो यह बहुत अच्छा होगा।

उत्तर

14

आप सही है कि एक उपवर्ग में __init__ को परिभाषित करने को ओवरराइड करता है सुपर क्लास के __init__ कर रहे हैं, लेकिन आप हमेशा super(CurrentClass, self).__init__ उपयोग कर सकते हैं उपवर्ग से सुपर क्लास के निर्माता कॉल करने के लिए। इसलिए, आपको superclass के प्रारंभिक कार्य को डुप्लिकेट करने की "मैन्युअल" को "मैन्युअल" करने की आवश्यकता नहीं है।

एक तरफ ध्यान दें, भले ही अजगर विधि से अधिक भार का समर्थन नहीं करता है, यह है, जिसका अर्थ आप आसानी से बस अलग स्वीकार कर अतिभारित कार्यों के व्यवहार का अनुकरण कर सकते हैं (*args और **kwargs के माध्यम से वैकल्पिक तर्क के अलावा) डिफ़ॉल्ट तर्क का समर्थन करता है आपके फ़ंक्शन/विधि कार्यान्वयन में तर्कों का सबसेट।

+1

और यदि आप '* args'/'** kwdargs **' विधि का उपयोग विशिष्ट कार्यों में कुछ प्रेषण करने के लिए करते हैं, तो आपको एहसास होता है कि वास्तव में अलग-अलग नामों को अलग-अलग करने के लिए वास्तव में चोट नहीं होती है :) –

+0

मुझे सुपर –

+0

@tom के साथ त्रुटि त्रुटि मैंने निश्चित रूप से ऐसा किया है, क्या यह एक नया शब्द है? मैं http://mathcs.holycross.edu/~kwalsh/python/ पर कोशिश कर रहा हूं क्योंकि मेरे पास इस मशीन में पाइथन नहीं है –

1

तो अगर मैं कुछ चर आरंभ कर रहा हूँ और में कुछ कार्यों बुला एक वर्ग Class1 के __init__, तो मैं एक उपवर्ग class2 (Class1) इसके बारे में, मैं Class1 के चर के सभी reinitialize करने के लिए है और उन कार्यों फोन था निकाले जाते हैं कक्षा 2 के __init__ में?

नहीं। आपको बस सुपरक्लास के __init__() पर कॉल करना होगा। Here, और here, आप इसे कैसे प्राप्त कर सकते हैं।

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