2011-06-14 14 views
8

नीचे दिए गए नमूने में, B.Go() विधि में अंतिम 2 पंक्तियां विधि class A से विधि को कॉल करें। क्या वे कार्यात्मक रूप से समान हैं? super() का उपयोग करने का एकमात्र लाभ है कि मुझे विरासत में क्लास नाम जानने की आवश्यकता नहीं है?पायथन का सुपर() फ़ंक्शन

class A(object): 
    def Go(self): 
     print "Calling A.Go()" 

class B(A): 
    def Go(self): 
     super(B, self).Go() 
     A.Go(self) 

inst = B() 
inst.Go() 
+3

शायद आप 'ए() के बजाय' एजीओ (स्वयं) 'का मतलब है (जाओ)। –

+1

@ थॉमस - अपडेट किया गया, धन्यवाद। – tMC

उत्तर

14

नहीं दिखाने के लिए एक राज्य की आवश्यकता है, super() कुछ A.Go नहीं कर सकते हैं के लिए एक सीधा कॉल करता है। super(B, self).Go() विधि समाधान आदेश में अगली विधि को कॉल करता है। यह विधि को कॉल करता है कि को कहा गया था B विधि को लागू नहीं किया गया था। प्रत्यक्ष रैखिक विरासत में यह हमेशा A है, इसलिए कोई वास्तविक अंतर नहीं है (आपके द्वारा दोहराए जाने वाले वर्ग के अलावा।) एकाधिक विरासत के मामले में, सामान्य विधि संकल्प आदेश में अगली कक्षा वर्तमान के प्रत्यक्ष बेसक्लास नहीं है कक्षा। इन सुविधाओं के Guido's original explanation में हीरा विरासत के लिए स्पष्टीकरण देखें।

2

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

+1

यह सच नहीं है। 'ए()। जाओ() 'आप जो भी वर्णन करेंगे वह करेंगे। 'एजीओ (स्वयं)' कक्षा ए पर गो विधि प्राप्त कर रहा है, लेकिन किसी उदाहरण के लिए बाध्य नहीं है, और उसके बाद स्वयं को पास कर रहा है (इस मामले में बी का एक उदाहरण) उस विधि के उदाहरण पैरामीटर के रूप में। – Ben

+2

आह, क्षमा करें, मुझे अभी एहसास हुआ कि मूल विवरण संपादित किया गया है। रेमंड के आलेख संदर्भ के लिए – Ben

1

वे पूरी तरह से अलग हैं। कॉलिंग ए()। जाओ() एक पूरी नई ऑब्जेक्ट का निर्माण करें, जो किसी भी विशेषता को उस इंस्टेंस के साथ साझा नहीं करता है जिसमें इसे बनाया गया था।

आपका उदाहरण भी आसान है, आप वास्तविक अलग व्यवहार

4

Thomas Wouters द्वारा प्रदान किए गए उत्कृष्ट उत्तर के अतिरिक्त, मैं जोड़ता हूं कि super() अतिरिक्त रूप से बहुत उपयोगी है क्योंकि यह एक संगणित संकेत है। super() का उपयोग करने का एक प्रमुख लाभ यह है कि आपको प्रतिनिधि वर्ग को नाम से निर्दिष्ट करने की आवश्यकता नहीं है, जो बाद में बेस क्लास को बदलना आसान बनाता है। रेमंड हेटिंगर के बारे में इस पर एक अच्छी पोस्ट है: Python's super() considered super!

+1

+1। –

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