2016-06-07 4 views
6

मेरे पास दो कक्षाएं एक माता-पिता और अन्य बच्चे हैं।पैरेंट क्लास विधि में अपना नाम बदलने के बिना अतिरिक्त कार्यक्षमता जोड़ना

class Parent(object): 

    def __init__(self): 
     #does something 

    def method_parent(self): 
     print "Parent" 

class Child(Parent): 

    def __init__(self): 
     Parent.__init__(self) 

    def method_parent(self): 
     print "Child" 

माता पिता मैं जनक विधि method_parent कि विधि के मूल कार्यक्षमता रखने संशोधित करना चाहते हैं इनहेरिट और कहा कि विधि के लिए कोड के कुछ अतिरिक्त लाइनें जोड़ने के बाद।

मुझे पता है कि मैं की तरह

def method_child(self): 
    self.method_parent() 
    #Add extra lines of code to perform something 

एक नई पद्धति बना सकते हैं लेकिन मैं विधि का मूल नाम का उपयोग करना चाहते। मुझे लगता है कि विधि के लिए स्रोत कॉपी नहीं कर सकते, क्योंकि विधि एक C मॉड्यूल

से है कि मैं क्या हासिल करना चाहते हैं इस

def method_parent(): 
    #do parent_method stuff 
    #do extra stuff 

की तरह कुछ है कि यहां तक ​​कि संभव है?

उत्तर

6

तुम हमेशा माता-पिता का उपयोग कर super() समारोह से कोड कॉल कर सकते हैं। यह माता-पिता का संदर्भ देता है। तो, parent_method() पर कॉल करने के लिए, आपको super().parent_method() का उपयोग करना चाहिए।

कोड स्निपेट (python3 के लिए) से पता चलता है कि यह कैसे उपयोग करने के लिए है।

class ParentClass: 
    def f(self): 
     print("Hi!"); 

class ChildClass(ParentClass): 
    def f(self): 
     super().f(); 
     print("Hello!"); 

को Python2 में, आप अतिरिक्त तर्क के साथ सुपर कॉल करने की आवश्यकता: super(ChildClass, self)। तो, टुकड़ा बन जाएगा:

class ParentClass: 
    def f(self): 
     print("Hi!"); 

class ChildClass(ParentClass): 
    def f(self): 
     super(ChildClass, self).f(); 
     print("Hello!"); 

आप ChildClass का एक उदाहरण पर f() कॉल करते हैं, यह दिखा देंगे: "! हाय हैलो"।

यदि आप पहले ही जावा में कोडित हैं, तो यह मूल रूप से एक ही व्यवहार है। जहां भी आप चाहें सुपर को कॉल कर सकते हैं। एक विधि में, init समारोह में, ...

वहाँ भी है कि करने के लिए अन्य तरीके हैं, लेकिन यह कम स्वच्छ है। उदाहरण के लिए, आप कर सकते हैं:

ParentClass.f(self) 

अभिभावक वर्ग के एफ फ़ंक्शन को कॉल करने के लिए।

class Child(Parent): 

    def __init__(self): 
     Parent.__init__(self) 

    def method_parent(self): 
     Parent.method_parent(self) # call method on Parent 
     print "Child" 

यह एक है जब आप स्पष्ट रूप जनक वर्ग के नाम हैं:

4

यह super समारोह क्या करता है।

class Child(Parent): 

    def __init__(self): 
     super(Child, self).__init__() 

    def method_parent(self): 
     super(Child, self).method_parent() 
     print "Child" 

अजगर 3 में, आप तर्क के बिना super कॉल कर सकते हैं, जैसे super().method_parent()

1

आप ठीक उसी तरह आप __init__ एक के लिए इस्तेमाल किया माता-पिता विधि कॉल कर सकते हैं। आप prefere हैं, तो आप super का उपयोग करके आप विधि संकल्प आदेश में अगली कक्षा देने के लिए अजगर पूछ सकते हैं:

def method_parent(self): 
     super(Child, self).method_parent() # call method on Parent 
     print "Child" 
संबंधित मुद्दे