পাইথন ট্রাডিশনাল মানে (সেম নাম, আলাদা সিগনেচার) ফাংশন ওভারলোডিং সাপোর্ট করে না — последের ডেফিনিশন আগেরটিকে ওভাররাইড করে। তবে ডিফল্ট আর্গামেন্ট, *args, **kwargs, বা @singledispatch ব্যবহার করে ওভারলোডিং-সদৃশ আচরণ অর্জন করা যায়।
পদ্ধতি ১: ডিফল্ট আর্গামেন্ট (সিম্পলেস্ট)
class Human:
def sayHello(self, name=None):
if name is not None:
print('Hello ' + name)
else:
print('Hello ')
obj = Human()
obj.sayHello() # Hello
obj.sayHello('Rambo') # Hello Rambo
পদ্ধতি ২: *args / **kwargs
def greet(*names):
for name in names:
print(f"Hello {name}")
greet() # (কিছু প্রিন্ট হয় না)
greet("Alice") # Hello Alice
greet("Alice", "Bob") # Hello Alice \n Hello Bob
পদ্ধতি ৩: @singledispatch (ফাংশন ওভারলোডিং আসল)
from functools import singledispatch
@singledispatch
def process(data):
raise NotImplementedError(f"Unsupported type: {type(data)}")
@process.register(int)
def _(data):
print(f"Integer: {data * 2}")
@process.register(str)
def _(data):
print(f"String: {data.upper()}")
@process.register(list)
def _(data):
print(f"List length: {len(data)}")
process(10) # Integer: 20
process("hello") # String: HELLO
process([1,2,3]) # List length: 3
পদ্ধতি ৪: টাইপ হিন্ট + متعددة ডিসপ্যাচ (multipledispatch লাইব্রেরি)
pip install multipledispatch
from multipledispatch import dispatch
@dispatch(int, int)
def add(a, b):
return a + b
@dispatch(str, str)
def add(a, b):
return a + b
print(add(2, 3)) # 5
print(add("Hello", "World")) # HelloWorld
সারাংশ
| পদ্ধতি | উপযোগিতা |
|---|---|
| ডিফল্ট আর্গামেন্ট | সিম্পল, কম প্যারামিটার |
| *args/**kwargs | ভেরিয়েবল সংখ্যক আর্গামেন্ট |
| @singledispatch | সিঙ্গল আর্গামেন্ট টাইপ ভিত্তিক ডিসপ্যাচ (স্ট্যান্ডার্ড লাইব্রেরি) |
| multipledispatch | মাল্টি-আর্গামেন্ট টাইপ ভিত্তিক ডিসপ্যাচ |