
Python Inheritance Part - 02 ( MRO and super() )
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() মেথড কল করছে।

