
Method Overloading
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 “। ইন্সটল না করে এভাবে কোড করলে আমাদেরকে এরর দিবে।
এখন আমরা যদি এই কোডটি রান করি তবে দেখতে পারবো কোন এরর না দিয়েই আমাদেরকে আউটপুট দিয়েছে ৬০।


