2012-02-19 13 views
22

मान लीजिए कि मेरे पास दो वर्ग हैं (एक माता-पिता और एक उप-वर्ग)। यदि subclass में विधि को भी परिभाषित किया गया है, तो मैं अभिभावक वर्ग में किसी विधि को कैसे संदर्भित करूं?पायथन में मूल विधि का संदर्भ कैसे लें?

यहाँ कोड है:

class A: 
    def __init__(self, num): 
     self.value=num 
    def f(self, num): 
     return self.value+2 
class B(A): 
    def f(self, num): 
     return 7*self.f(num) 

बहुत अंतिम पंक्ति में, मैं "self.f (संख्या)" कमांड, नहीं बी में विधि के साथ ही माता-पिता वर्ग एक का उल्लेख करना चाहते हैं जो एक अनंत रिकर्सन बना देगा। पहले ही, आपका बहुत धन्यवाद।

उत्तर

28

आप जानते हैं कि आप के लिए एक भी स्पष्ट रूप से इस तरह से एक का उल्लेख कर सकते उपयोग करना चाहते हैं :

class B(A): 
    def f(self,num): 
     return 7 * A.f(self,num) 

याद रखें कि आपको स्पष्ट रूप से सदस्य फ़ंक्शन एएफ()

+0

मुझे ऐसा करने में कोई त्रुटि हुई, जब मैंने एक विधि को कॉल करने का प्रयास किया, जिसे सी में लागू किया गया था। यह ए के पहले पैरामीटर के रूप में एक उदाहरण की उम्मीद थी और बी को बाल वर्ग के रूप में नहीं पहचान पाया। मुझे लगता है कि सुपर() का उपयोग करना उसके आसपास हो सकता है, लेकिन मुझे अभी तक यकीन नहीं है। – erikbwork

35

उपयोग super:

return 7 * super(B, self).f(num) 

या अजगर 3 में, यह सिर्फ है:

return 7 * super().f(num) 
+0

यह सैद्धांतिक रूप से सही है, लेकिन किसी कारण से, मुझे मिलता है: TypeError: super() तर्क 1 टाइप होना चाहिए, क्लासोब – user1111042

+6

@ user1111042: मुझे अनुमान लगाने दो - आप Python 2.x का उपयोग कर रहे हैं? फिर आपके _class ए_ को _object_ से प्राप्त होना चाहिए, केवल तभी आपको एक नई शैली कक्षा मिल जाएगी। नई स्टाइल क्लास कक्षा _type_ के उदाहरण हैं, जबकि पुराने स्टाइल क्लासेस _classobj_ के उदाहरण हैं। _super() _ केवल नई शैली कक्षाओं पर काम करता है। – pillmuncher

+0

हां, मैं पाइथन 2.x और सुपर का उपयोग कर रहा हूं जैसा आपने कहा है 2.x – user1111042

1
class B(A): 
    def f(self, num): 
     return 7 * super(B, self).f(num) 
1

क्यों स्वयं को सरल नहीं रखना है?

class B(A): 
    def f(self, num): 
     return 7 * A.f(self, num) 
0

आप सुपर का उपयोग कर सकते हैं या यदि आप अधिक स्पष्ट हो सकते हैं और ऐसा कुछ कर सकते हैं।

class B(A): 
    def f(self, num): 
    return 7 * A.f(self, num) 
5

अन्य उत्तर के साथ लाइन में, वहाँ तथापि अजगर-3.x में प्रक्रिया को सरल बनाया गया है, (निर्माता सहित) सुपर वर्ग तरीकों कॉल करने के लिए कई तरीके हैं:

अजगर -2 .x

class A(object): 
def __init__(self): 
    print "world" 

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

अजगर-3.x

class A(object): 
def __init__(self): 
    print "world" 

class B(A): 
def __init__(self): 
    print "hello" 
    super().__init__() 

super() अब super(<containing classname>, self) के समतुल्य the docs के बराबर है।

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