2013-04-09 5 views
14

को ध्यान में रखते:अजगर सुपर() विरासत और जरूरत तर्क

class Parent(object): 

    def altered(self): 
     print "PARENT altered()" 

class Child(Parent): 

    def altered(self): 
     print "CHILD, BEFORE PARENT altered()" 
     super(Child, self).altered() # what are the arguments needed? Why Child and self? 
     print "CHILD, AFTER PARENT altered()" 

अजगर 2.7 में, क्यों Childsuper() कॉल करने के लिए एक तर्क के रूप में पारित किया जाना चाहिए? बस इसे काम करने की बजाय सुपर का उपयोग करने की सटीक जटिलताएं क्या हैं।

+7

जहां तक ​​मुझे पता है, इसे एमआरओ के साथ करना है। लेकिन मैं इसे "वास्तविक" उत्तर के लिए समझाते हुए पर्याप्त नहीं हूं। शायद यह मदद करता है: http://rhettinger.wordpress.com/2011/05/26/super-Considered-super/ नोट हालांकि पाइथन 3 में अब तर्क की आवश्यकता नहीं है। –

+0

तो पहला तर्क "चाइल्ड" है जिस कक्षा में आप हैं, उस व्यक्ति के लिए और जिस व्यक्ति से आप उत्तराधिकारी होना चाहते हैं उसके बाद से माता-पिता आधार है? मुझे लगता है कि कुछ ऐसा लगता है। पढ़ने के लिए भी धन्यवाद और मैं स्पष्ट होने के लिए पायथन 2.7 का उपयोग कर रहा हूं। मैं सुपर() –

उत्तर

18

super बताते हैं कि विधि समाधान आदेश में अगली कक्षा कौन सा है। आपके द्वारा पारित किए गए दो तर्क यह है कि यह समझने देता है कि self इसे संपूर्ण एमआरओ को एक विशेषता के माध्यम से देता है; वर्तमान वर्ग यह बताता है कि आप एमआरओ के साथ कहां हैं। तो क्या सुपर वास्तव में क्या कर रहा है मूल रूप से है:

def super(cls, inst): 
    mro = inst.__class__.mro() # Always the most derived class 
    return mro[mro.index(cls) + 1] 

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

+0

के बारे में पढ़ना जारी रखूंगा क्योंकि बेस क्लास के बजाए यह वर्तमान वर्ग है क्योंकि सुपर होने का पूरा बिंदु एक ऐसा कार्य है जो उस बेस क्लास को स्पष्ट रूप से संदर्भित करने के बजाय काम करता है । मुझे लगता है कि आपके द्वारा बताई गई रेखा ने इसे अच्छी तरह से समझाया। मैं एमआरओ में देखूंगा और महसूस करूंगा कि यह सिर्फ अजगर 2.x का एक पहलू है क्योंकि पाइथन 3 को इन तर्कों की आवश्यकता नहीं है। धन्यवाद। –

+3

@ कलैंडशोम पायथन 3 के सुपर वर्क्स बिल्कुल वही तरीके से - इसमें कुछ दिलचस्प परिस्थितियां हैं जो आपको अधिकतर परिस्थितियों में (कॉल स्टैक का निरीक्षण करके) के लिए तर्कों को समझने में सक्षम हैं। – lvc

+1

हम्म। महान जानकारी। कॉल स्टैक। मैंने बहुत अच्छा सीखा। धन्यवाद। –

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