"ম্রো ()" কি করে?


উত্তর:


211

বরাবর অনুসরণ...:

>>> 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__যে নাম সংজ্ঞায়িত করে।


9
হাই, অ্যালেক্স, ডি .__ ম্রো__ এবং ডি ম্রো () এর মধ্যে কোনও পার্থক্য রয়েছে কি না?
zjm1126

26
mroএকটি মেটাক্লাস দ্বারা কাস্টমাইজ করা যায়, ক্লাস ইনিশিয়েশনে একবার বলা হয় এবং ফলাফলটি সংরক্ষণ করা হয় __mro__- ডকস.পিথন.আর.গ্রাবারি / দেখুন দেখুন ।
অ্যালেক্স মার্টেলি

23
এট্রিবিউট রেজ্যুলেশন অর্ডারের পরিবর্তে কেন তাকে পদ্ধতি সমাধানের আদেশ বলা হয় ?
বেন্টলে 4

1
@ অ্যালেক্স মার্তেলি বলেছেন এবং পাইথন - হিস্টোরি.ব্লগস্পট . com / 2010 / 06 / এর বিষয়বস্তুর মতোই , নতুন শ্রেণিটি ব্যবহার করার সময় ম্রো অ্যাট্রিবিউট যুক্ত করা উচিত, কেবলমাত্র পাইথন ২.২ এমআরও এবং পাইথন ২.৩ এমআরও (সি 3) ব্যবহৃত.
অ্যান্ডি

82

mro()মানে রেজোলিউশন অর্ডার। এটি ক্লাস থেকে প্রাপ্ত ধরণের তালিকাগুলির তালিকা দেয় যাতে তারা পদ্ধতিগুলির জন্য অনুসন্ধান করা হয়।

mro () বা __mro__ কেবলমাত্র নতুন স্টাইলের ক্লাসে কাজ করে। অজগর 3 এ তারা কোনও সমস্যা ছাড়াই কাজ করে। তবে অজগর 2 এ সেই ক্লাসগুলির উত্তরাধিকার সূত্রে প্রাপ্ত হওয়া দরকার object


10

এটি সম্ভবত সমাধানের ক্রমটি প্রদর্শন করবে।

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'>]

নিয়মটি গভীরতা-প্রথম, যার ক্ষেত্রে ডি, বি, এ, সি বোঝানো হবে

উত্তরাধিকার সূত্রে প্রাপ্ত ক্লাসগুলি অনুসন্ধান করার সময় পাইথন সাধারণত একটি গভীরতার প্রথম অর্ডার ব্যবহার করে তবে যখন দুটি শ্রেণি একই বর্গ থেকে উত্তরাধিকার সূত্রে আসে, পাইথন সেই শ্রেণীর প্রথম উল্লেখটিকে ম্রো থেকে সরিয়ে দেয়।


1
সুতরাং আপনি দেখতে পাচ্ছেন অর্ডারটি ডি, বি, এ, সি
স্ট্রাইকার

1
"পাইথন" শ্রেণীর প্রথম উল্লেখটি ম্রো থেকে সরিয়ে দেয় "এর অর্থ কী?
রুথ্বিক ভাইলা

2
@ রুথ্বিকভাইলা: আমি মনে করি যে অংশটি খুব খারাপভাবে বলা হয়েছে। পাইথনের ইতিহাস সম্পর্কে এই ব্লগ পোস্টে গাইডো ভ্যান রসুম মন্তব্য করেছেন (পাইথন ২.২-এ প্রবর্তিত এমআরও স্কিম সম্পর্কে) "যদি এই সন্ধানে কোনও শ্রেণি নকল করা হত তবে শেষ ঘটনাটি ছাড়া সমস্ত কিছুই এমআরও তালিকা থেকে মুছে ফেলা হবে" (জোর দেওয়া খনি) )। এটি সূচিত করে যে এটি ক্লাসের প্রথম "উল্লেখ" এর চেয়ে বেশি কিছু সরিয়ে ফেলতে পারে।
মার্টিনো

1

হীরার উত্তরাধিকারের ক্ষেত্রে রেজোলিউশনের ক্রম আলাদা হবে।

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
ভাদিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.