এটি নিজের ব্লগ পোস্ট পদ্ধতি রেজোলিউশন অর্ডারে (আগের দুটি প্রচেষ্টা সহ) গিডো দ্বারা যুক্তিসঙ্গত পরিমাণের সাথে বিশদভাবে বিশদ করা হয়েছে ।
আপনার উদাহরণে, 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()
কলগুলির অভাব রয়েছে , সুতরাং আমাকে ব্যাখ্যা করতে দিন: উদাহরণগুলির মূল বিষয়টি এমআরও কীভাবে নির্মিত তা দেখানো। তারা "প্রথম \ n সেকেন্ড \ তৃতীয়" বা যাই হোক না কেন মুদ্রণের উদ্দেশ্যে নয় । আপনি - এবং অবশ্যই অবশ্যই উদাহরণটি নিয়ে খেলতে পারেন, super()
কল যুক্ত করতে পারেন, কী ঘটেছিল তা দেখতে এবং পাইথনের উত্তরাধিকারের মডেলটির আরও গভীর উপলব্ধি অর্জন করতে পারেন। তবে আমার লক্ষ্য এখানে এটিকে সহজ রাখা এবং এমআরও কীভাবে নির্মিত তা দেখানো। আমি এটি ব্যাখ্যা হিসাবে এটি নির্মিত হয়েছে:
>>> Fourth.__mro__
(<class '__main__.Fourth'>,
<class '__main__.Second'>, <class '__main__.Third'>,
<class '__main__.First'>,
<type 'object'>)
super()
কোনও কাজে আসে না। আমি লিনিয়ার উত্তরাধিকার ব্যবহার করে ক্লাসগুলির সাথে এটি ব্যবহার করার পরামর্শ দেব না, যেখানে এটি কেবল অকেজো ওভারহেড।