यह अपने ब्लॉग पोस्ट मेथड रेजोल्यूशन ऑर्डर (दो पहले के प्रयासों सहित) में स्वयं गिदो द्वारा विस्तार से उचित मात्रा में दिया गया है ।
आपके उदाहरण में, Third()
कॉल करेगा First.__init__
। पायथन वर्ग के माता-पिता में प्रत्येक विशेषता के लिए दिखता है क्योंकि वे बाएं से दाएं सूचीबद्ध हैं। इस मामले में, हम तलाश कर रहे हैं __init__
। इसलिए, यदि आप परिभाषित करते हैं
class Third(First, Second):
...
अजगर को देखकर शुरू हो जाएगा First
, और, अगर First
विशेषता नहीं है, तो यह दिखेगा Second
।
यह स्थिति तब और जटिल हो जाती है जब वंशानुक्रम पथ को पार करना शुरू कर देता है (उदाहरण के लिए यदि First
विरासत में से Second
)। अधिक विवरण के लिए ऊपर दिए गए लिंक को पढ़ें, लेकिन, संक्षेप में, पायथन उस क्रम को बनाए रखने की कोशिश करेगा जिसमें प्रत्येक वर्ग वंशानुक्रम सूची में दिखाई देता है, जो कि बाल वर्ग के साथ ही शुरू होता है।
उदाहरण के लिए, यदि आपके पास था:
class First(object):
def __init__(self):
print "first"
class Second(First):
def __init__(self):
print "second"
class Third(First):
def __init__(self):
print "third"
class Fourth(Second, Third):
def __init__(self):
super(Fourth, self).__init__()
print "that's it"
एमआरओ होगा [Fourth, Second, Third, First].
वैसे: यदि पायथन को एक सुसंगत विधि संकल्प आदेश नहीं मिल सकता है, तो यह एक अपवाद को बढ़ा देगा, बजाय व्यवहार में वापस आने के जो उपयोगकर्ता को आश्चर्यचकित कर सकता है।
अस्पष्ट एमआरओ का एक उदाहरण जोड़ने के लिए संपादित:
class First(object):
def __init__(self):
print "first"
class Second(First):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
print "third"
क्या Third
एमआरओ होना चाहिए [First, Second]
या [Second, First]
? कोई स्पष्ट उम्मीद नहीं है, और पायथन एक त्रुटि उठाएंगे:
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution order (MRO) for bases Second, First
संपादित करें: मैं कई लोगों को यह तर्क देते हुए देखता हूं कि ऊपर दिए गए उदाहरणों में कमी super()
है, इसलिए मुझे समझाएं: उदाहरणों का बिंदु यह दिखाना है कि MRO का निर्माण कैसे किया जाता है। वे "पहले \ nsecond \ third" या जो कुछ भी प्रिंट करने के लिए अभिप्रेत नहीं हैं । आप निश्चित रूप से - और, उदाहरण के साथ खेलना चाहते super()
हैं, कॉल जोड़ें , देखें कि क्या होता है, और पायथन के विरासत मॉडल की गहरी समझ हासिल करें। लेकिन यहां मेरा लक्ष्य इसे सरल रखना है और यह दिखाना है कि एमआरओ कैसे बनाया जाता है। और यह बनाया गया है जैसा कि मैंने समझाया:
>>> Fourth.__mro__
(<class '__main__.Fourth'>,
<class '__main__.Second'>, <class '__main__.Third'>,
<class '__main__.First'>,
<type 'object'>)
super()
किसी काम का नहीं है। मैं इसे रैखिक वंशानुक्रम का उपयोग करके कक्षाओं के साथ उपयोग करने की अनुशंसा नहीं करूंगा, जहां यह सिर्फ बेकार उपरि है।