ইনহেরিটেন্সের মত পলিমরফিজম (polymorphism) ও একটি গুরুত্বপূর্ণ প্যারাডাইম। একই জিনিসের ( অপারেটর, মেথড ইত্যাদি ) একাধিক ব্যবহারকে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এ পলিমরফিজম বলে। প্রথমেই আমরা খুবই সাধারন একটি উদাহরণ দেখে নেই –

# This is an example of polymorphism in Python
class MathClass:
    def __init__(self,x,y):
        self.x=x
        self.y=y
    def Multiply_function(self):
        result=self.x*self.y
        return result
        
class MathClass2:
    def __init__(self,x,y,z):
        self.x=x
        self.y=y
        self.z=z
    def Multiply_function(self):
        result=self.x*self.y*self.z
        return result
     
FirstObject=MathClass(5,10) # creating an object
SecondObject=MathClass2(4,2,10) # creating an object
 
print(FirstObject.Multiply_function()) # Accessing a method
print(SecondObject.Multiply_function()) # Accessing a method

ফলাফল-

50                                                                                                  
80

এখানে দুইটি ভিন্ন ভিন্ন ক্লাস আছে কিন্তু দুইটি ক্লাসেরই একই মেথড আছে Multiply_function(); একটাতে দুইটা প্যারামিটার এবং আর একটাতে তিনটা। এখানে একই ফাংশনের দুটি ভিন্ন ভিন্ন রুপ দেখতে পাচ্ছি।

অপারেটর ওভারলোডিং (Operator Overloading)

আমরা আগেই পাইথনের বিভিন্ন অপারেটর সম্পর্কে জেনে এসেছি। একটা অপারেটরের কাজ কি? এক কথায় বলতে গেলে এক বা একাধিক অপারেন্ডের উপর কাজ করা। যেমন, + অপারেটরের কাজ দুইটা অপারেন্ডকে যোগ করা, – অপারেটরের কাজ একটা অপারেন্ড থেকে আর একটাকে বিয়োগ করা। কিন্তু যদি আমরা একটা অবজেক্টকে আর একটা অবজেক্ট এর সাথে যোগ বা বিয়োগ করতে চাই, তাহলে কি সম্ভব? না, এটা সরাসরি সম্ভব না। এটাকে ওভারলোড করতে হবে অর্থাৎ পাইথনের যে বিল্ট-ইন ফাংশনের ডেফিনিশন আছে সেখানে অবজেক্ট সম্পর্কে কিছু বলা নেই, তাই আমাদেরকে একটু অতিরিক্ত প্রোগ্রাম করে সেটাকে বুঝিয়ে দিতে হবে; আর এটাকেই অপারেটর ওভারলোডিং বলে। একটা উদাহরণ দেখে নেই –

# This is an example of an operator overloading in Python
class TestClass:
    def __init__(self,x):
        self.x=x
    def __add__(self,secondclass):
        y=self.x+secondclass.x
        return y
    
FirstObject=TestClass(5) # creating an object
SecondObject=TestClass(10) # creating an object

print(FirstObject+SecondObject) # + Operator Overloading

ফলাফল-

15

এখানে ফলাফল ১৫ এসেছে, অর্থাৎ + অপারেটরটি একটা অবজেক্টকেও যোগ করতে পারছে। ১২তম লাইনে + অপারেটরকে ওভারলোড করা হয়েছে। + অপারেটরকে ওভারলোড করতে __add_ ফাংশনটি ব্যবহার করে হয়েছে। একইভাবে – বা * অপারেটরকে ওভারলোড করতে যথাক্রমে __sub__ এবং __mul__ ফাংশন ব্যবহার করতে হয়, ইত্যাদি।

ফাংশন ওভারলোডিং (Function Overloading)

একই ফাংশনের বিভিন্ন অর্গুমেন্টের উপর ভিত্তি করে ভিন্ন ভিন্ন আচরণ করাকে ফাংশন ওভারলোডিং বলা হয়সি++ প্রোগামিং এর মত পাইথনের ওপারেটর ওভারলোডিং এতটা সরল নয়, একটু ভিন্নভাবে ব্যবহার করতে হয়। আসুন আমরা একটা উদাহরণ দেখে নেই-

# This is an example of an function overloading in Python
class TestClass:
    def Greetings(self, surname=None):
        if surname!=None:
            print("Welcome "+surname)
        else:
            print("Welcome!")
    
Object=TestClass() # creating an object

Object.Greetings() # Function Overloading
Object.Greetings("Shahinur") # # Function Overloading

ফলাফল-

Welcome!                                                                                                                      
Welcome Shahinur

পূর্বেই বলেছি সি++ বা অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজের মত পাইথনে সরাসরি ফাংশন ওভারলোডিং করা যায়না, তাই ৩য় লাইনের ফাংশন ডেফিনিশনে ডিফল্ট ভ্যালু none দিয়ে সাম্যাবস্থা আনা হয়েছে। কিছুই যদি পাস না করা হয় তাহলে ডিফল্ট ভ্যালু none থাকবে, কিন্তু কিছু একটা থাকলেই surname এর ভ্যালু ওটাই হয়ে যাবে।

১১ এবন ১২ তম লাইনে একই ফাংশন ভিন্ন প্যারামিটার ব্যবহার করে কল করা হয়েছে, এটাই ফাংশন ওভারলোডিং।

ফাংশন ওভার রাইডিং (Function Overriding)

ফাংশন ওভাররাইডিং মূলত ইনহেরিটেন্স এর সাথে সম্পর্কিত। প্যারেন্ট ক্লাসের কোন ফাংশনকে চাইল্ড ক্লাসের ফাংশন দ্বারা পরিবর্তন করাকেই ফাংশন ওভারলোডিং বলে। একটি উদাহরণের সাহায্যে বিষয়টা দেখে নেই –

# This is an example of an function overriding in Python
class Class1:
    def __init__(self,x,y):
        self.x=x
        self.y=y
    def DoingSOmething(self):
        z=self.x+self.y
        return z
        
class Class2(Class1):
    def __init__(self,x,y):
        self.x=x
        self.y=y
    def DoingSOmething(self):
        z=self.x*self.y
        return z
    
FirstObject=Class1(5,10) # creating an object
SecondObject=Class2(5,10) # creating an object

print(FirstObject.DoingSOmething()) # Function overriding
print(SecondObject.DoingSOmething()) # Function overriding

ফলাফল-

15                                                                                                                            
50

এখানে DoingSOmething() ফাংশনটি ওভাররাইট করা হয়েছে। যদিও DoingSOmething() ফাংশনটি বেজ ক্লাসে আছে তবুও চাইল্ড ক্লাসে এটিকে পরিবর্তন করা হয়েছে।