super
वास्तव में इस स्थिति के लिए है, लेकिन यह केवल काम करता है अगर आप इसे लगातार इस्तेमाल करते हैं। सभी का उपयोग आधार वर्ग भी नहीं करते हैं super
यह काम नहीं करेगा, और जब तक विधि object
में है आप super
कॉल की श्रृंखला समाप्त करने के लिए एक आम आधार वर्ग की तरह कुछ का उपयोग करने के लिए है।
class FooBase(object):
def foo(self): pass
class A(FooBase):
def foo(self):
super(A, self).foo()
print 'A.foo()'
class B(FooBase):
def foo(self):
super(B, self).foo()
print 'B.foo()'
class C(A, B):
def foo(self):
super(C, self).foo()
print 'C.foo()'
@Marcin पूछता क्यों एक आम आधार हो गया है:
FooBase
कि foo
लागू करता है लेकिन super()
फोन नहीं करता आखिरी वर्ग super()
फोन है कि एक विशेषता त्रुटि प्राप्त होगी क्योंकि वहां कोई बिना कॉल करने के लिए आधार विधि।
अगर वहाँ अलग आधार वर्ग थे class A(AFooBase):
और class B(BFooBase):
A
में super()
कॉल AFooBase
में विधि और B
में विधि के नाम से जाना कभी नहीं होगा कहेंगे। जब आधार सभी वर्गों के लिए आम है, तो यह विधि समाधान आदेश के अंत तक जाता है और आप निश्चित हो सकते हैं कि कक्षा वर्ग को परिभाषित करने के लिए कक्षाओं को परिभाषित करने के लिए कोई फर्क नहीं पड़ता है।
उत्तर के लिए धन्यवाद। अब मैं सुपर() का उपयोग न करने के लिए अब गंदा महसूस नहीं करता हूं। – sayap
स्पष्ट रूप से बेस क्लास विधियों को कॉल करते समय * प्रश्नकर्ता के उदाहरण जैसे बहुत ही सरल परिदृश्यों के लिए काम कर सकते हैं, यदि आधार वर्ग स्वयं एक सामान्य आधार से प्राप्त होते हैं तो आप टूट जाएंगे और आप नहीं चाहते कि अंतिम बेस क्लास की विधि को दो बार बुलाया जाए । इसे "हीरा विरासत" के रूप में जाना जाता है और यह कई एकाधिक विरासत प्रणालियों (जैसे सी ++ में) के लिए एक बड़ी समस्या है। पायथन की सहयोगी एकाधिक विरासत ('सुपर() 'के साथ) आपको कई मामलों में आसानी से हल करने देती है (हालांकि यह कहना नहीं है कि एक सहकारी एकाधिक विरासत पदानुक्रम डिजाइन करना आसान है या हमेशा एक अच्छा विचार है)। आत्मनिरीक्षण – Blckknght