2013-04-22 9 views
5

किसी को इस साइट पर यह वही समस्या थी, लेकिन उत्तर उस हिस्से से संबंधित नहीं था जिसमें मुझे परेशानी है।
विरासत - विधिविरासत की समस्याएं। - पायथन

निम्न श्रेणी परिभाषाओं पर विचार करें।

class C1(object): 
    def f(self): 
     return 2*self.g() 

    def g(self): 
     return 2 

class C2(C1): 
    def f(self): 
     return 3*self.g() 


class C3(C1): 
    def g(self): 
     return 5 

class C4(C3): 
    def f(self): 
     return 7*self.g() 

obj1 = C1() 
obj2 = C2() 
obj3 = C3() 
obj4 = C4() 
इस समस्या पर विचार करने के जो तरीकों जब f विधि कहा जाता है कहा जाता है आप कर रहे हैं के लिए

। तो उदाहरण के लिए, जब obj1.f() कहा जाता है, fC1 की विधि को कॉल किया जाता है जिसे C1 की g विधि कहा जाता है। यह फार्म

['C1.f', 'C1.g'] 

लिखें तीन असाइनमेंट बयान है कि क्रमश: चर obj2_calls को obj2.f() के लिए 'को कॉल सूची' प्रदान करती है की एक 'बुला सूची' के रूप में प्रतिनिधित्व किया जा सकता है, के लिए obj3.f() के लिए 'को कॉल सूची' प्रदान करती है परिवर्तनीय obj3_calls और वेरिएबल obj4_calls पर obj4.f() के लिए 'कॉलिंग सूची' असाइन करता है।

मैं पहला काम को समझने कोई समस्या नहीं है, यह obj2_calls = ['C2.f', 'C1.g']
है है, लेकिन मैं अगले एक पता लगाने की कोशिश मेरी दिमाग wracking कर रहा हूँ। मैंने सोचा कि चूंकि C3.f नहीं है कि सूची ['C1.f'] होगी लेकिन दुर्भाग्य से यह नहीं है।

बस स्पष्ट करने के लिए, इस होमवर्क

+3

वास्तव में क्या चल रहा है यह जानने के लिए प्रत्येक फ़ंक्शन में कुछ 'प्रिंट' कथन जोड़ें। –

+0

यदि आप C3.f में टाइप करते हैं तो आपको c3.f दिखाई देगा जिसका अर्थ है कि इसका वर्ग C3 – Greg

+0

का हिस्सा है हाय लोग बहुत उपयोगी हैं, प्रिंट का उपयोग करके मेरे पास सही उत्तर है। लेकिन मैंने कोड को समझने के लिए इसे पाने के लिए और अधिक सामान्य ज्ञान का उपयोग किया। मैं अभी भी समझना चाहता हूं कि उत्तर obj3_calls = ['C1.f', 'C3.g'] क्यों था।मुझे नहीं लगता कि 'c1.g' को 'c1.f' –

उत्तर

1

obj3_calls ['C1.f', 'C3.g'] है। जैसा कि आप इंगित करते हैं, उस वर्ग में C3.f नहीं है, लेकिन इस विधि को C1 से विरासत में मिला है। यह बदले में self.g पर कॉल करता है, और C3.g परिभाषित किया गया है, यह C1 से विरासत में प्राप्त विधि को ओवरराइड करता है।

3

इसे अपनी कक्षा के विधि समाधान आदेश (एमआरओ) के साथ करना है। (कुछ उपयोगी जानकारी के लिए here देखें)

आप सही तरीके से कहा गया है, कोई C3.f समारोह वहाँ है, इसलिए अजगर एमआरओ है कि f परिभाषित में पहली आधार स्तरीय पर f विधि की खोज करता है। इस मामले में, वह है (C1)। अब, वह विधि (C1.f) self.g() पर कॉल करती है। इस मामले में selfC3 का एक उदाहरण है, तो निश्चित रूप से self.gC3.g पर कॉल करता है क्योंकि यह एमआरओ में उच्चतम g फ़ंक्शन है। आप गारंटी नहीं है कि आप C1.g प्राप्त करना चाहता था, तो आप यह स्पष्ट रूप से करने की ज़रूरत होगी:

class C1(object): 
    def f(self): 
     return 2*C1.g(self) 
    def g(self): 
     return 5 

जो भी के बारे में डबल अंडरस्कोर नाम mangling में बात कर के लिए एक अच्छा नेतृत्व में बना देता है। चूंकि यह एक अलग विषय है, हालांकि शायद link to some useful documentation छोड़ना सबसे अच्छा है।

+0

बहुत बढ़िया है, इसके लिए धन्यवाद, और हर किसी के लिए उनकी मदद के लिए। मैं अब समझता हूँ –

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