ගයිඩෝ විසින්ම ඔහුගේ බ්ලොග් පෝස්ට් ක්රමවේදය විසර්ජන නියෝගයෙන් මෙය සවිස්තරාත්මකව සවිස්තරාත්මකව දක්වා ඇත (මීට පෙර උත්සාහයන් දෙකක් ද ඇතුළුව) .
ඔබගේ උදාහරණයේ දී, Third()
අමතනු First.__init__
ඇත. පංතියේ දෙමව්පියන් වමේ සිට දකුණට ලැයිස්තුගත කර ඇති බැවින් පයිතන් සෑම ගුණාංගයක්ම සොයයි. මෙම අවස්ථාවේ දී, අපි සොයන්නෙමු __init__
. එබැවින්, ඔබ අර්ථ දක්වන්නේ නම්
class Third(First, Second):
...
Python මීට උදාහරණ දෙස විසින් ආරම්භ වනු ඇත 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"
MRO වනු ඇත [Fourth, Second, Third, First].
මාර්ගය වන විට: පයිතන්ට සුහද ක්රමවේද විභේදන අනුපිළිවෙලක් සොයාගත නොහැකි නම්, එය පරිශීලකයා පුදුමයට පත් කළ හැකි හැසිරීම් වලට වැටීම වෙනුවට ව්යතිරේකයක් මතු කරයි.
නොපැහැදිලි MRO සඳහා උදාහරණයක් එක් කිරීමට සංස්කරණය කරන ලදි:
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
'' ගේ MRO විය [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 \ තෙවන" හෝ ඕනෑම දෙයක් මුද්රණය කිරීමට අදහස් කළේය. ඔබට - සහ, ඇත්ත වශයෙන්ම, උදාහරණය සමඟ සෙල්ලම් කළ යුතුය, super()
ඇමතුම් එක් කළ යුතුය, සිදුවන්නේ කුමක්දැයි බලන්න, සහ පයිතන්ගේ උරුම ආකෘතිය පිළිබඳ ගැඹුරු අවබෝධයක් ලබා ගත යුතුය. නමුත් මෙහි මගේ ඉලක්කය වන්නේ එය සරලව තබාගෙන MRO ගොඩනගා ඇති ආකාරය පෙන්වීමයි. එය මා විසින් පැහැදිලි කළ පරිදි ගොඩනගා ඇත:
>>> Fourth.__mro__
(<class '__main__.Fourth'>,
<class '__main__.Second'>, <class '__main__.Third'>,
<class '__main__.First'>,
<type 'object'>)
super()
ඕනෑම ප්රයෝජනයක් ඇති එකම අවස්ථාව බහු උරුමයයි . රේඛීය උරුමය භාවිතා කරන පන්ති සමඟ එය භාවිතා කිරීම මම නිර්දේශ නොකරමි.