2009-12-24 16 views
5

अजगर 2.x में, सुपर निम्नलिखित मामलोंक्यों पाइथन सुपर केवल उदाहरण स्वीकार नहीं करता है?

class super(object) 
| super(type) -> unbound super object 
| super(type, obj) -> bound super object; requires isinstance(obj, type) 
| super(type, type2) -> bound super object; requires issubclass(type2, type) 
| Typical use to call a cooperative superclass method: 

स्वीकार करता है के रूप में जहाँ तक मैं देख, सुपर, एक वर्ग है एक वर्ग के सुपर क्लास को हल करने के प्रकार और (अंततः) उदाहरण लपेटकर। जैसे

  • क्यों वहाँ भी कोई super(instance), विशिष्ट उपयोग के साथ:

    मैं नहीं बल्कि चीजों की एक जोड़ी से हैरान हूँ super(self).__init__()। तकनीकी तौर पर, आप वस्तु से ही एक वस्तु के प्रकार प्राप्त कर सकते हैं, तो वर्तमान रणनीति super(ClassType, self).__init__() तरह का अनावश्यक है। मैं पुरानी शैली के वर्गों, या एकाधिक विरासत के साथ संगतता मुद्दों को मानता हूं, लेकिन मैं आपका बिंदु सुनना चाहता हूं।

  • क्यों, दूसरे हाथ पर, अजगर 3 स्वीकार करेंगे (देखें Understanding Python super() with __init__() methods) super().__init__()? मैं इसमें जादू का प्रकार देखता हूं, स्पष्ट ज़ेन की तुलना में स्पष्ट का उल्लंघन करना बेहतर है। मैं अधिक उपयुक्त self.super().__init__() देखा होगा।

उत्तर

6

super(ClassType, self).__init__()नहीं एक सहकारी एकाधिक वंशानुक्रम योजना में अनावश्यक है - ClassType जरूरी self के प्रकार नहीं है, लेकिन वर्ग जिसमें से आप __init__ को सहकारी कॉल करना चाहते हैं।

वर्ग पदानुक्रम C inherits B inherits A में, C.__init__ में आप C's नजरिए से सुपर क्लास 'init कॉल करना चाहते हैं, और आप B.__init__ कहते हैं; तो B.__init__ में आप सुपर को वर्ग प्रकार B गुजरना होगा - जब से तुम बी के बुला सुपर-क्लास (या बल्कि, वर्ग सी के बी के बाद एमआरओ में अगले) को हल करना चाहते हैं।

class A (object): 
    def __init__(self): 
    pass 

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

class C (B): 
    def __init__(self): 
    super(C, self).__init__() 

अगर आप अब c = C() का दृष्टांत, आप देखते हैं कि वर्ग प्रकार निरर्थक नहीं है - super(self).__init__()B.__init__ अंदर वास्तव में काम नहीं होता! आप क्या करते हैं कि आप मैन्युअल रूप से निर्दिष्ट करते हैं कि कौन सा वर्ग सुपर कॉलिंग विधि है (यह विधि के वर्ग को इंगित करने वाले छिपे हुए चर द्वारा पाइथन 3 के सुपर में हल किया गया है)।

+0

मुझे लगता है कि आप कक्षा बी (ए) का मतलब है: और कक्षा सी (बी): –

+0

हालांकि, आप सही हैं। यह कभी भी बी से ए .__ init __() को कॉल करने में सक्षम नहीं होगा, क्योंकि विधि बी .__ init __() में स्वयं प्रकार सी होगा, जिसका प्रत्यक्ष सुपर बी है, ए नहीं। इसलिए बी .__ init __() को फिर से बुलाया जाएगा। –

+0

आह आप टाइपो के बारे में सही हैं, धन्यवाद! और यह एकाधिक विरासत योजनाओं में और भी जटिल हो जाता है, मुझे लगता है कि मुझे इसके बारे में एक लिंक मिल सकता है। – u0b34a0f6ae

3

मैं एक विशिष्ट उत्तर प्रदान नहीं कर सकता, लेकिन क्या आपने पीईपी के सुपर कीवर्ड के आसपास पढ़ा है? मैं एक त्वरित गूगल खोज किया था और यह पीईपी 367 और पीईपी 3135.

http://www.python.org/dev/peps/pep-0367/

http://www.python.org/dev/peps/pep-3135/#numbering-note

किसी भी अन्य भाषा मैं का पता है, समय की सबसे आप पायथन के लिए जवाब मिल सकता है के विपरीत के साथ आया था स्पष्ट तर्कसंगत और स्थिति बयान के साथ पीईपी में quirks।

अद्यतन:

3135 के माध्यम से पढ़ने के बाद, अजगर मेलिंग और भाषा में संबंधित ईमेल का संदर्भ यह एक तरह से समझ में आता है कि ऐसा क्यों है जिस तरह से यह अजगर 2 के लिए

http://docs.python.org/library/functions.html?highlight=super#super

है बनाम पायथन 3.

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

पीईपी 3135 सब कुछ बदल जाता है, क्योंकि यह प्रस्तुत किया और सुपर करने के लिए एक DRY'er दृष्टिकोण के लिए एक तर्क जीता।

+0

मैं मानता हूँ, लेकिन मैं एक ही समय में बढ़ रही है सवाल _while_ का जवाब पाने के लिए कोशिश कर रहा हूँ:

सुपर और एकाधिक वंशानुक्रम के उदाहरण के साथ दो लिंक stackoverflow जानकारी। –

+0

@Stefano मैंने अपनी मूल पोस्ट करने के तुरंत बाद मैंने एक ही चीज़ सोचना शुरू कर दिया। – David

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