2015-09-22 3 views
5

मान लें कि मेरे पास 3 कक्षाएं हैं: ए, बी और सी ए बी और बी के लिए बेस क्लास सी है। सी पदानुक्रम सामान्य रूप से यहां रखा जाता है, लेकिन एक विधि के लिए यह अलग होना चाहिए। सी क्लास के लिए यह काम करना चाहिए जैसे कि यह इस तरह एएक वर्ग से पायथन इनहेरिट लेकिन एक और कक्षा को कॉल करने वाली विधि ओवरराइड करें?

से विरासत में मिला था उदाहरण के लिए:

class A(object): 
    def m(self): 
     print 'a' 

class B(A): 
    def m(self): 
     super(B, self).m() 
     print 'b' 

class C(B): 
    def m(self): 
     super(A, self).m() 
     print 'c' 

तो बुनियादी तौर पर इसे इस तरह से काम करना चाहिए:

a = A() 
a.m() 
a 

b = B() 
b.m() 
a 
b 

c = C() 
c.m() 
a 
c 

लेकिन यह करने के लिए जा नहीं है सी कक्षा के लिए काम, क्योंकि मुझे यह त्रुटि मिलती है:

AttributeError: 'super' object has no attribute 'm' 

सी कक्षा के लिए इसे हल करने के लिए मैं क्लास से प्राप्त कर सकता हूं एस, लेकिन मैं बी से सबकुछ प्राप्त करना चाहता हूं और उस विशिष्ट विधि के लिए m बेस क्लास ए के लिए सुपर कॉल का मतलब है। मेरा मतलब है कि विधि एक अपवाद है। या मुझे काम करने के लिए कक्षा सी के लिए इसे किसी तरह अलग तरीके से कॉल करना चाहिए?

मैं यह कैसे कर सकता हूं?

+1

क्या आपने 'सुपर 'का उपयोग करने के बजाय' एएम (स्वयं) 'का प्रयास किया था? –

+0

@MathiasEttinger नहीं मैंने नहीं किया, लेकिन अब मैंने कोशिश की और यह पूरी तरह से काम करता है। धन्यवाद। आप इसे उत्तर के रूप में पोस्ट कर सकते हैं, क्योंकि इससे काम करने के लिए मेरी समस्या – Andrius

+0

हल हो गई है, एएम() एक क्लास विधि – fixmycode

उत्तर

4

super कॉल का उपयोग करके, पाइथन आपके वर्ग के MRO का निरीक्षण करेगा ताकि यह निर्धारित किया जा सके कि आप जिस फ़ंक्शन को चाहते हैं उसे कॉल करते समय किस वर्ग का उपयोग करना है।

जब से तुम शॉर्ट सर्किट को यह व्यवहार चाहते हैं, आप स्पष्ट रूप से वर्ग आप से साथ विधि का उपयोग करना चाहते हैं कह सकते हैं:

class C(B): 
    def m(self): 
     A.m(self) 
     print 'c' 
8

वास्तव में इस को हल करने के दो तरीके हैं: आप शॉर्टकट कर सकते हैं super() करने के लिए कॉल और पूरी तरह से मैथियास Ettinger के जवाब के रूप में एमआरओ बाईपास, या आप बस जारी कर सकते हैं सही कॉल super() रहे हैं:

class C(B): 
    def m(self): 
     super(B, self).m() 
     print 'c' 

याद रखें कि super() उम्मीद करता है कि पहली कक्षा जिस वर्ग से इसे एमआरओ देखना शुरू कर देना चाहिए। आमतौर पर वह कक्षा होती है जिसमें कॉल किया जाता है, लेकिन यदि आप चाहें तो आप एमआरओ में ऊपरी कक्षा को पार कर सकते हैं।

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