Advertisement
Python Inheritance Part - 02 ( MRO and super() )

Python Inheritance Part - 02 ( MRO and super() )

Ata Alahy Nishan

Ata Alahy Nishan

@nishan56

views

Share this article

গত আর্টিকেলে আমরা পাইথন এর ইনহেরিট্যান্স এবং তার প্রকারভেদ নিয়ে আলোচনা করেছিলাম। সেখানে Multiple Inheritance সম্পর্কে জেনেছি আমরা। Multiple Inheritance এ একটি চাইল্ড ক্লাসের একাধিক প্যারেন্ট ক্লাস থাকে। আমরা জানি কো্ন চাইল্ড ক্লাসের মধ্যে যে প্রোপার্টি বা মেথড আছে , ঠিক সেম নামে মেথড বা প্রোপার্টি যদি তার প্যারেন্ট ক্লাসে থাকে তাহলে সেটি ওভাররাইড হয়ে যায়। আবার ধরা যাক , আমরা এমন একটি প্রোপার্টি বা মেথড অ্যাক্সেস করতে চাচ্ছি সেটি চাইল্ড ক্লাসে নেই ; কিন্তু প্যারেন্ট ক্লাসে এবং সেই চাইল্ড ক্লাসের যতগুলো প্যারেন্ট আছে তাদের সবার কাছেই আছে। এক্ষেত্রে চাইল্ড ক্লাস কার মেথড বা প্রোপার্টি পাবে ? এক্ষেত্রে চলে আসে MRO concept এবং super() method।

Method Resolution Order

MRO এর পূর্ণরূপ হচ্ছে Method Resolution Order। এটি এমন একটি সিস্টেম যার মাধ্যমে ঠিক করা হয় কোন মেথড বা প্রোপার্টি কল হবে। আমরা যদি mro() বা __mro__ মেথড কল করি তাহলে সেটি দেখতে পারবো।

class A:
    def show(self):
        print("Class A")

class B(A):
    def show(self):
        print("Class B")

class C(A):
    def show(self):
        print("Class C")

class D(B, C):
    pass

d = D()
d.show()
print(D.mro())

Output

Class B
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

দেখা যাচ্ছে , কোন মেথড বা প্রোপার্টি অ্যাক্সেস করতে চাইলে সবার আগে D তে খুজবে , না পেলে B এরপর C এবং তারপর A তে। অর্থাৎ , খেয়াল করলে দেখতে পারবো পাইথনে MRO বাম থেকে ডানে খুজে দেখে। আর এটিই MRO

super() Method

আমরা জানি , প্যারেন্ট ক্লাসে যদি কোন প্রোপার্টি বা মেথড থাকে এবং ঠিক সেম নামে মেথড বা প্রোপার্টি যদি চাইল্ড ক্লাসে থাকে তবে প্যারেন্ট ক্লাস এর প্রোপার্টি বা মেথড চাইল্ড ক্লাস ইউজ করে না। MRO System এর কারনে। ব্যাপারটা হচ্ছে এমন যে , “ আমাদের নিজেদের কাছে যখন ফোন থাকে তখন কিন্তু আর আমরা আমাদের বাবা-মায়ের ফোন ইউজ করি না। কিন্তু যদি এমন হয় , আমরা কাউকে কল করবো কিন্তু আমাদের ফোনে ব্যালেন্স নেই ; তখন কিন্তু আমাদের বাবা-মায়ের ফোন বাধ্য হয়ে ইউজ করতে হয়“। প্রোগ্রামিং এর ক্ষেত্রেও সেম। অনেক সময় চাইল্ড ক্লাসের প্রোপার্টি আর প্যারেন্ট ক্লাসের প্রোপার্টি দুটোই দরকার হয়। তখন আমাদের কাজে লাগবে super() method

class Father:
    def __init__(self):
        print("Father constructor called")

class Child(Father):
    def __init__(self):
        super().__init__()
        print("Child constructor called")

c = Child()
c.show()
Father constructor called
Child constructor called
class A:
    def show(self):
        print("A class")

class B(A):
    def show(self):
        print("B class")
        super().show()

class C(A):
    def show(self):
        print("C class")
        super().show()

class D(B, C):
    def show(self):
        print("D class")
        super().show()

d = D()
d.show()
D class
B class
C class
A class

এখানে super().show() মেথড কল করার ফলে MRO অনুযায়ী তার সব প্যারেন্ট ক্লাসের show() মেথড কল করছে।

Ata Alahy Nishan

About Ata Alahy Nishan

Author at CST Club - sharing insights on technology, programming, and development.

Advertisement
Advertisement
Recommended Content

Recommended Posts

Advertisement
Recommended Content