
Method Overriding
Share this article
মেথড ওভাররাইডিং মানে হচ্ছে প্যারেন্ট ক্লাসে যে মেথড ডিফাইন করা হয়েছে সেই নামে মেথড চাইল্ড ক্লাসে ডিফাইন করা। এতে করে প্যারেন্ট ক্লাসের সেই মেথডটি আর চাইল্ড ক্লাসে কাজ করবে না। অর্থাৎ , ওভাররাইড হয়ে যাবে। কেও কেও এই ব্যাপারটিকে মেথড ওভারলোডিং মনে করতে পারেন , কিন্তু পাইথনে সরাসরি মেথড ওভারলোডিং করা যায় না। যারা যারা মেথড ওভারলোডিং সম্পর্কে জানি না , তারা এই আর্টিকেলটি পড়তে পারি।
class Calculator:
def Sum(self , a:int , b:int):
return a + b
class SubCalculator(Calculator):
pass
sub_calculator = SubCalculator()
print(sub_calculator.Sum(10 , 20))
#Output:30
উপরের কোডে আমরা একটি ক্যাল্কুলেটর ক্লাস তৈরি করেছি এবং সেই ক্লাসটি SubCalculator নামে অন্য একটি ক্লাসে ইনহেরিট করেছি। সেহেতু , ইনহেরিট্যান্স এর নিয়ম অনুযায়ী Parent Calculator এর সবকিছু SubCalculator class পেয়ে যাবে। সে কারনে আমরা SubCalculator এর একটি অব্জেক্ট তৈরি করে Sum মেথড এর মাধ্যমে দুইটি সংখ্যা যোগ করেছি। আউটপুট এসেছে ৩০
***যারা ইনহেরিট্যান্স এবং সাথে মেথড রেজুলেশন অর্ডার সম্পর্কে জানি না তারা নিচের আর্টিকেল পড়ে আসতে পারি
কিন্তু কি হতো যদি আমরা সেম নামে মেথডটাই SubCalculator class এ ডিফাইন করে দিতাম? তাহলে কি প্যারেন্ট ক্লাসের Sum মেথড টি এক্সিকিট হতো নাকি নিজের কাছে থাকা Sum মেথডটি এক্সিকিউট হতো? একটি উদাহারনের মাধ্যমে বোঝা যাক বিষয়টা।
class Calculator:
def Sum(self , a:int , b:int):
print("Sum method of Calculator class")
return a + b
class SubCalculator(Calculator):
def Sum(self , a:int , b:int):
print("Sum method of SubCalculator class")
return a + b
sub_calculator = SubCalculator()
print(sub_calculator.Sum(10 , 20))
'''
Output
------
Sum method of SubCalculator class
30
'''
উপরের কোড স্নিপেটে আমরা Calculator and SubCalculator নামে দুইটি ক্লাস তৈরি করেছি। SubCalculator ক্লাসে Calculator ক্লাস ইনহেরিট করেছি। ফলে , Sum মেথডটি SubCalculator ক্লাস থেকে এক্সেস করা যাবে। সেইসাথে SubCalculator ক্লাসেও Sum নামে মেথড ডিফাইন করে রেখেছি এবং মেথডের মধ্যে প্রিন্ট স্টেট্মেন্ট রেখেছি। যাতে বুঝতে পারি কোন ক্লাসের মেথড কল হয়েছে।
এই কোডটি রান করলে দেখতে পারবো আউটপুট হিসেবে দেখাবে “Sum method of SubCalculator class “ এবং ৩০। অর্থাৎ , বুঝতে পারছি SubCalculator ক্লাসের Sum মেথডটি এক্সিকিউট হয়েছে। তারমানে , SubCalculator ক্লাসে থাকা Sum মেথডটি প্যারেন্ট ক্লাসে থাকা Sum মেথডটিকে ওভাররাইড করে ফেলেছে।
কিন্তু যদি কখনো এমন প্রয়োজন হয় যে , চাইল্ড ক্লাসে মেথড ওভাররাইড করার পরেও প্যারেন্ট ক্লাসের সেই মেথড এর রেজাল্ট আমাদের দরকার। তখন কিভাবে কাজ করতে হবে? সেই কাজ করা জন্য আমাদের super() and MRO সম্পর্কে জ্ঞান থাকা দরকার। যারা জানি না তারা এই আর্টিকেল পড়তে পারি
init method overriding
class Common:
def __init__(self , name , dept):
self.name = name
self.dept = dept
class Student(Common):
def __init__(self , name , dept , session , roll , reg):
super().__init__(name , dept)
self.session = session
self.roll = roll
self.reg = reg
def showInfo(self):
print(
f"Name:{self.name}\nRoll:{self.roll}\nReg:{self.reg}\nSession:{self.session}\nDepartment:{self.dept}\n"
)
class Teacher(Common):
def showInfo(self):
print(
f"Name:{self.name}\nDepartment:{self.dept}\n"
)
student = Student(name = "Nishan" , roll = 12345 , reg = 123456 , dept = "CST" , session = "23-24")
student.showInfo()
teacher = Teacher(name = "MR . X" , dept = "CST")
teacher.showInfo()
"""
Output:
Name:Nishan
Roll:12345
Reg:123456
Session:23-24
Department:CST
Name:MR . X
Department:CST
"""
এই কোডটি রান করলে উপরের আউটপুট গুলো পাবো। কি হয়েছে , সেটা একটু ডিপলি বোঝা যাক।
আমাদের টার্গেট হচ্ছে স্টুডেন্ট এবং টিচার ক্লাস তৈরি করা। স্টুডেন্ট এবং টিচার এই দুইটি ক্লাসেই কিন্তু কমন কিছু প্রোপার্টি আছে ( name and dept )। তাই প্রথমে আমরা কমন নামে একটি ক্লাস তৈরি করেছি , যা অব্জেক্ট তৈরি করার সময় name , dept আর্গুমেন্ট হিসেবে নিবে। এখন এই কমন নামের ক্লাসটি স্টুডেন্ট ক্লাসের মধ্যে ইনহেরিট করেছি। কিন্তু , সমস্যা হচ্ছে নাম এবং ডিপার্ট্মেন্ট বাদেও কিন্তু একজন স্টুডেন্ট এর রোল এবং রেজিস্ট্রেশন নাম্বার থাকে। সেজন্য আমরা init মেথডটি ওভারররাইড করেছি। যার ফলে common নামে যে ক্লাসটি ইনহেরিট করেছি Student ক্লাসে সেই ক্লাসের init মেথড কল হবে না ইনিশিয়ালি। যেহেতু আমাদের নিজের কাছেই init মেথড রয়েছে। এখন আমরা যদি এই অবস্থায় প্যারেন্ট ক্লাসের init মেথড কল না করি , তাহলে আমাদেরকে এক্সট্রা দুইটি ভ্যারিয়েবল ইনিশিয়ালাইজ করতে হতো এভাবে
self.name = name
self.dept = dept
কিন্তু এই কাজটি করলে আমাদের কোড রিপিট হতো। তাই আমরা সুপার ক্লাস থেকে init মেথড কল করে দিয়েছি। ফলে আমাদেরকে আর এই দুইটি ভ্যারিয়েবল ইনিশিয়ালাইজ করতে হয় নি। এভাবে আমরা আমাদের প্রয়োজন অনুযায়ী মেথড ওভাররাইডিং করে আমাদের কাজ সম্পন্ন করতে পারি


