উত্তর:
বরাবর অনুসরণ...:
>>> 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__
- ডকস.পিথন.আর.গ্রাবারি / দেখুন দেখুন ।
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