2009-08-11 10 views
10

या क्या मुझे बस सुपरक्लास का स्पष्ट रूप से संदर्भ देना चाहिए जिनकी विधियों को मैं कॉल करना चाहता हूं?क्या पाइथन में सुपर() का उपयोग करना अच्छा विचार है?

अपने रचनाकारों का संदर्भ देते समय सुपर क्लास के नाम दोहराने के लिए भंगुर लगता है, लेकिन यह पृष्ठ http://fuhm.net/super-harmful/ सुपर() का उपयोग करने के खिलाफ कुछ अच्छे तर्क देता है।

उत्तर

8

पुस्तक Expert Python Programming ने अध्याय 3 में "सुपर नुकसान" के विषय पर चर्चा की है। यह पढ़ने योग्य है। नीचे पुस्तक का निष्कर्ष है:

सुपर उपयोग सुसंगत होना चाहिए: कक्षा पदानुक्रम में, सुपर को हर जगह या कहीं भी इस्तेमाल नहीं किया जाना चाहिए। सुपर और क्लासिक कॉल मिक्सिंग एक भ्रमित अभ्यास है। लोग अपने कोड के लिए अधिक स्पष्ट होने के लिए सुपर से बचने के लिए जाते हैं।

संपादित करें: आज मैं पुस्तक के इस हिस्से को फिर से पढ़ता हूं। मैं कुछ और वाक्यों की प्रतिलिपि बनाउंगा, क्योंकि सुपर उपयोग मुश्किल है:

  • अपने कोड में एकाधिक विरासत से बचें।
  • इसके उपयोग के अनुरूप बने रहें और नई शैली और पुरानी शैली को मिश्रित न करें।
  • अपने उप-वर्ग में अपनी विधियों को कॉल करने से पहले कक्षा पदानुक्रम की जांच करें।
1

हां, बस अपने __init__ विधियों में कीवर्ड तर्कों के साथ चिपके रहें और आपको बहुत सी समस्याएं नहीं होनी चाहिए।

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

5

आप सुपर का उपयोग कर सकते हैं, लेकिन जैसा कि लेख कहता है, कमियां हैं। जब तक आप उन्हें जानते हैं, तब तक सुविधा का उपयोग करने में कोई समस्या नहीं है। यह लोगों की तरह है "रचना का उपयोग करें, विरासत नहीं" या "वैश्विक चर का कभी भी उपयोग न करें"। यदि सुविधा मौजूद है, तो एक कारण है। बस समझना सुनिश्चित करें कि क्यों और क्या और बुद्धिमानी से उनका उपयोग करें।

+12

* "यदि सुविधा मौजूद है, तो एक कारण है।" * यह तर्क केवल असत्य है। कई भाषाओं में ऐसी विशेषताएं होती हैं जिनका उपयोग कभी भी किसी के द्वारा नहीं किया जाना चाहिए। –

2

मुझे सुपर() अधिक पसंद है क्योंकि यह आपको विरासत वर्ग को बदलने की अनुमति देता है (उदाहरण के लिए जब आप रिफैक्टरिंग कर रहे हैं और इंटरमीडिएट क्लास जोड़ते हैं) सभी तरीकों से इसे बदले बिना।

+2

जब तक कि आप अभी तक पायथन 3 का उपयोग नहीं कर रहे हैं (जो कि पाइथन उपयोग का बहुमत है) – nosklo

+1

आपका क्या मतलब है? सुपर() पायथन 2 पर भी है। – juanjux

+0

मुझे विश्वास है कि मुझे विश्वास है। –

3

super के साथ लोगों की समस्या एकाधिक विरासत की एक समस्या है। तो super को दोष देने के लिए यह थोड़ा अनुचित है। super के बिना एकाधिक विरासत भी बदतर है। मिशेल Simionato अच्छी तरह से सुपर पर अपने blog article में इस लिपटे:

दूसरी ओर, एक अगर सभी सुपर मौसा कुछ गंभीर समस्या अंतर्निहित के संकेत नहीं हैं आश्चर्य हो सकता है। यह अच्छी तरह से हो सकता है कि समस्या सुपर के साथ नहीं है, न ही सहकारी विधियों के साथ: समस्या एकाधिक विरासत के साथ हो सकती है।

तो मुख्य सबक यह है कि आपको एकाधिक विरासत से बचने की कोशिश करनी चाहिए।

स्थिरता के हित में मैं हमेशा सुपर का उपयोग करता हूं, भले ही एकल विरासत के लिए यह वास्तव में कोई फर्क नहीं पड़ता (माता-पिता वर्ग के नाम को जानने के छोटे लाभ के अलावा)। पायथन 3+ super में अधिक सुविधाजनक है, इसलिए वहां निश्चित रूप से सुपर का उपयोग करना चाहिए।

2

सुपर() आपके लिए एकाधिक विरासत की समस्या को हल करने का प्रयास करता है; अपने अर्थशास्त्र को दोहराना मुश्किल है और आपको निश्चित रूप से कोई नया अर्थशास्त्र नहीं बनाना चाहिए जबतक कि आप पूरी तरह से सुनिश्चित न हों।

एकल विरासत के लिए, वहाँ वास्तव में

class X(Y): 
    def func(self): 
     Y.func(self) 

और

class X(Y): 
    def func(self): 
     super().func() 

बीच कोई अंतर नहीं है, इसलिए मुझे लगता है कि है कि स्वाद का सिर्फ सवाल है।

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

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