Advertisement
Method Overloading

Method Overloading

4 min read
View on Hashnode

Share this article

একটি ক্লাসের মধ্যে যখন একই নামের অনেকগুলো মেথড থাকে তবে ভিন্ন ভিন্ন প্যারামিটার বা ডাটা টাইপের , তখন সেটাকে মেথড ওভারলোডিং বলে। জাভা বা সি প্লাস প্লাস এইসব ল্যাঙ্গুয়েজে এমন ধরনের মেথড ওভারলোডিং সাপোর্ট করে। তবে পাইথনে এমন মেথড ওভারলোডিং সাপোর্ট করে না। যদি একই নামে একাধিক মেথড ( হোক ভিন্ন ভিন্ন প্যারামিটার এর ) ডিফাইন করি তবে একদম শেষে যে মেথড টি ডিফাইন করা হয়েছে সেটি কাজ করবে। অর্থাৎ উপরে একই নামে থাকা মেথড গুলো ওভাররাইড করে ফেলবে

class Calculator:
    def Sum(self , a:int , b:int):
        return a + b

    def Sum(self , a:int , b:int , c:int):
        return a + b + c
calculator = Calculator()
print(calculator.Sum(10 , 20 , 30))

আমি চাইছি যে , দুটি বা তিনটি সংখ্যার মধ্যে যোগ করতে। তবে যদি দুইটি সংখ্যা দিই তাহলে Sum নামে প্রথম মেথডটি কাজ করবে এবং যদি তিনটি সংখ্যা দিই তাহলে দ্বিতীয় মেথডটি কাজ করবে।

**যদি কেও মেথড সম্পর্কে না জেনে থাকি তাহলে আমার লেখা এই আর্টিকেলটি তে আগে ট্যুর দিয়ে আসি।

এখন , যদি আমরা উপরের কোড স্নিপেট টি রান করি তাহলে দেখতে পারবো আউটপুট এসেছে 60

অর্থাৎ , তিনটি আরগুমেন্ট পাস করেছি এবং শেষের মেথডটি যোগ করে আমাকে ফলাফল দিয়েছে। কিন্তু যদি চাই দুইটি সংখ্যা যোগ করবো , তাহলে কি হবে?

print(calculator.Sum(10 , 20))

ERROR!
Traceback (most recent call last):
  File "<main.py>", line 8, in <module>
TypeError: Calculator.Sum() missing 1 required positional argument: 'c'

একটি এরর এসেছে। বলা হয়েছে যে , আমার Sum নামে মেথড ১ টি আরগুমেন্ট মিসিং পাচ্ছে। কিন্তু , আমরা চেয়েছিলাম দুইটি আরগুমেন্ট পাস করলে প্রথম মেথড দুইটি সংখ্যা যোগ করে আমাকে ৩০ আউটপুট দিবে। অর্থাৎ , জাভা তে যেমন ভাবে মেথড ওভারলোডিং কাজ করে সেভাবে পাইথনে কাজ করে না।

তবে , আমরা চাইলে এই সমস্যা তিনভাবে সমাধান করতে পারি

1) Variable lenght argument ( *args )

আমরা মেথড এর মধ্যে প্যারামিটার হিসেবে টাপল নিবো এবং সেই টাপলকে ফর লুপের মাধ্যমে গানিতিক অপারেশন সম্পন্ন করবো। নিচের উদাহারনের মাধ্যমে বুঝা যাক বিষয়টা

class Calculator:
    def Sum(self , *nums):
        SUM = 0
        for num in nums:
            SUM += num
        return SUM
calculator = Calculator()
print(calculator.Sum(10 , 20 ))
print(calculator.Sum(10 , 20 , 30))
print(calculator.Sum(10 , 20 , 30 , 40))
print(calculator.Sum(10 , 20 , 30 , 40 , 50))

এই কোডটি যদি রান করি তাহলে দেখতে পারবো আমাদের আউটপুট এসেছে যথাক্রমে ৩০ , ৬০ , ১০০ , ১৫০। অর্থাৎ , কতগুলো সংখ্যা দিচ্ছি সেটা কোন ফ্যাক্টর না। সবগুলোকে টাপল হিসেবে এক্সেপ্ট করে ফর-লুপ চালিয়ে আমাকে কাংখিত উত্তর দিচ্ছে।

2) Default Argument

ডিফল্ট আরগুমেন্ট ইউজ করেও আমরা এমন কাজ করতে পারি। যতগুলো নাম্বার যোগ করতে চাই সে অনুযায়ী প্যারামিটার সেট করে ভ্যালু হিসেবে ইনিশিয়ালি 0করে দিবো। পরে প্রতিটি প্যারামিটার 0কিনা সেটি চেক করে অপারেশন করবো

class Calculator:
    def Sum(self , a = 0, b = 0, c = 0, d = 0):
        SUM = 0
        if a != 0:
            SUM += a
        if b != 0:
            SUM += b
        if c != 0:
            SUM += c
        if d != 0:
            SUM += d
        return SUM

calculator = Calculator()
print(calculator.Sum(10 , 20 ))
print(calculator.Sum(10 , 20 , 30))
print(calculator.Sum(10 , 20 , 30 , 40))
print(calculator.Sum(10 , 20 , 30 , 40 , 50))

এই কোডটি যদি রান করি তাহলে দেখতে পারবো আমাদের আউটপুট এসেছে যথাক্রমে ৩০ , ৬০ , ১০০। অর্থাৎ , প্রথম তিনটি ইনপুটের জন্য কাজ করেছে। কিন্তু লাস্টের দিকে এমন একটি এরর এসেছে

ERROR!
Traceback (most recent call last):
  File "<main.py>", line 17, in <module>
TypeError: Calculator.Sum() takes from 1 to 5 positional arguments but 6 were given

এখানে বলা হয়েছে , Sum নামের মেথড পাঁচটি আরগুমেন্ট আশা করে ( self সহ ) , তবে দেয়া হয়েছে ৬ টি। আমরা যদি আমাদের মেথডের দিকে তাকাই তাহলে দেখতে পারবো self সহ আমাদের প্যারামিটার আছে ৫ টি। কিন্তু , আমরা প্যারামিটার দিয়েছি ৬টি ( self সহ )। যদি কেও self সম্পর্কে না জানি তাহলে এই আর্টিকেল পড়তে পারি।

3) @dispatch ডেকোরেটর ব্যাবহার করে।

পাইথনের multipledispatch library তে থাকা dispatch decorator ব্যাবহার করে জাভা বা সি প্লাস প্লাস ল্যাঙ্গুয়েজে যেভাবে মেথড ওভারলোডিং করা যায় সেভাবে করতে পারি।

আগেই বলে রাখি , decorator নিজেই একটা ফাংশন যা অন্য কোন ফাংশন বা মেথডের ফাংশনালিটি ইনক্রিজ করে। অর্থাৎ , decorator function তার প্যারামিটার হিসেবে গোটা একটি ফাংশন কে নিয়ে নেয় এবং আমাদের দেয়া কন্ডিশন অনুযায়ী সেটি কাজ করে।

dispatch decorator এর মাধ্যমে মেথড ওভারলোডিং করতে চাইলে প্রতিটি মেথডের আগে dispatch decorator define করে তার মধ্যে প্যারামিটার হিসেবে এক্সট্রা ডাটা টাইপ বলে দিতে হবে

from multipledispatch import dispatch
class Calculator:
    @dispatch(int , int)
    def Sum(self , a , b):
        return a + b
    @dispatch(int , int , int)
    def Sum(self , a , b , c):
        return a + b + c
calculator = Calculator()
print(calculator.Sum(10 , 20 , 30))

multipledispatch ব্যাবহার করার আগে আমাদেরকে এই লাইব্রেরী ইন্সটল করে নিতে হবে। কমান্ড প্রম্পট ওপেন করে এই কমান্ড দিতে হবে “ pip install multipledispatch “। ইন্সটল না করে এভাবে কোড করলে আমাদেরকে এরর দিবে।

এখন আমরা যদি এই কোডটি রান করি তবে দেখতে পারবো কোন এরর না দিয়েই আমাদেরকে আউটপুট দিয়েছে ৬০।

Advertisement
Advertisement
3

reactions

Login to Hashnode to react

Advertisement
Advertisement

Comments

Comments are managed on Hashnode. Join the discussion there!

You'll need a Hashnode account to comment. It's free and takes seconds to sign up!

Advertisement
Recommended Content

Related Posts

Method Overriding

Method Overriding

মেথড ওভাররাইডিং মানে হচ্ছে প্যারেন্ট ক্লাসে যে মেথড ডিফাইন করা হয়েছে সেই নামে মেথড চাইল্ড ক্লাসে ডিফাইন করা। এতে করে প্যারেন্ট ক্লাসের সেই মেথডটি আর চাইল্ড ক্লাসে কাজ করবে না। অর্থাৎ , ওভাররাইড হয়ে যাবে। কেও কেও এই ব্যাপারটিকে মেথড ওভারলোডিং মনে করতে...

Ata Alahy NishanAta Alahy Nishan
4 min
oopmethod overrriding
Python Inheritance Part - 02 ( MRO and super() )

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

গত আর্টিকেলে আমরা পাইথন এর ইনহেরিট্যান্স এবং তার প্রকারভেদ নিয়ে আলোচনা করেছিলাম। সেখানে Multiple Inheritance সম্পর্কে জেনেছি আমরা। Multiple Inheritance এ একটি চাইল্ড ক্লাসের একাধিক প্যারেন্ট ক্লাস থাকে। আমরা জানি কো্ন চাইল্ড ক্লাসের মধ্যে যে প্রোপার্...

Ata Alahy NishanAta Alahy Nishan
2 min
super()_method_pythonMRO
Python Inheritance Part - 01

Python Inheritance Part - 01

Inheritance কি? Inhertitance হচ্ছে এমন এক পদ্ধতি যার মাধ্যমে একটি ক্লাসের প্রোপার্টি , মেথড অন্য কোন ক্লাসকে দেয়া যায়। এক্ষেত্রে যার থেকে ইনহেরিট করা হয়েছে তাকে বলে প্যারেন্ট ক্লাস এবং যার কাছে ইনহেরিট করা হয়েছে তাকে বলে চাইল্ড ক্লাস। Syntax of inher...

Ata Alahy NishanAta Alahy Nishan
4 min
hybrid-inherithierarchical-inheritance
Advertisement
Recommended Content