जवाबों:
साथ चलो...:
>>> class A(object): pass
...
>>> A.__mro__
(<class '__main__.A'>, <type 'object'>)
>>> class B(A): pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
>>> class C(A): pass
...
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
>>>
जब तक हमारे पास एकल वंशानुक्रम होता है, तब तक __mro__
बस टपल होता है: वर्ग, उसका आधार, उसके आधार का आधार और इसी तरह object
(केवल नई शैली की कक्षाओं के लिए काम करता है)।
अब, कई विरासत के साथ ...:
>>> class D(B, C): pass
...
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
... आपको यह भी आश्वासन मिलता है कि, __mro__
किसी भी वर्ग की नकल नहीं की जाती है, और कोई वर्ग अपने पूर्वजों के बाद नहीं आता है, उस वर्ग को बचाएं जो पहली बार कई विरासतों के समान स्तर पर प्रवेश करता है (जैसे बी और सी इस उदाहरण में) __mro__
बाएं से दाएं।
प्रत्येक विशेषता जो आपको एक वर्ग के उदाहरण पर मिलती है, न कि केवल तरीकों पर, वैचारिक रूप से इसके साथ-साथ देखा जाता है __mro__
, इसलिए, यदि पूर्वजों के बीच एक से अधिक वर्ग उस नाम को परिभाषित करते हैं, तो यह आपको बताता है कि विशेषता कहाँ मिलेगी - प्रथम श्रेणी में __mro__
कि उस नाम को परिभाषित करता है।
mro
मेटाक्लाज़ द्वारा अनुकूलित किया जा सकता है, इसे क्लास इनिशियलाइज़ेशन में एक बार कहा जाता है, और परिणाम को इसमें संग्रहीत किया जाता है __mro__
- देखें docs.python.org/library/… ।
mro()
विधि संकल्प आदेश के लिए खड़ा है। यह उन प्रकारों की एक सूची देता है, जिनसे कक्षा की खोज की जाती है, इस क्रम में वे विधियों की खोज करते हैं।
mro () या __mro__ केवल नई शैली की कक्षाओं पर काम करता है। अजगर 3 में, वे बिना किसी मुद्दे के काम करते हैं। लेकिन अजगर 2 में उन वर्गों से विरासत में प्राप्त करने की आवश्यकता है object
।
यह शायद संकल्प का क्रम दिखाएगा।
class A(object):
def dothis(self):
print('I am from A class')
class B(A):
pass
class C(object):
def dothis(self):
print('I am from C class')
class D(B, C):
pass
d_instance= D()
d_instance.dothis()
print(D.mro())
और प्रतिक्रिया होगी
I am from A class
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>]
नियम गहराई-प्रथम है, जिसका अर्थ इस मामले में डी, बी, ए, सी होगा।
पायथन आमतौर पर इनहेरिटिंग क्लासेस को खोजते समय गहराई-पहले क्रम का उपयोग करता है , लेकिन जब दो कक्षाएं एक ही क्लास से इनहेरिट करते हैं, तो पायथन एमआरओ से उस क्लास के पहले उल्लेख को हटा देता है।
हीरे की विरासत में रिज़ॉल्यूशन का क्रम अलग होगा।
class A(object):
def dothis(self):
print('I am from A class')
class B1(A):
def dothis(self):
print('I am from B1 class')
# pass
class B2(object):
def dothis(self):
print('I am from B2 class')
# pass
class B3(A):
def dothis(self):
print('I am from B3 class')
# Diamond inheritance
class D1(B1, B3):
pass
class D2(B1, B2):
pass
d1_instance = D1()
d1_instance.dothis()
# I am from B1 class
print(D1.__mro__)
# (<class '__main__.D1'>, <class '__main__.B1'>, <class '__main__.B3'>, <class '__main__.A'>, <class 'object'>)
d2_instance = D2()
d2_instance.dothis()
# I am from B1 class
print(D2.__mro__)
# (<class '__main__.D2'>, <class '__main__.B1'>, <class '__main__.A'>, <class '__main__.B2'>, <class 'object'>)
class B3
लेकिन दूसरे मामले में इसके class A
बाद जाना हैclass B1