آموزش پایتون - سربارگذاری متد

سربارگذاری متد (Method overloading) قابلیتی در برنامه‌نویسی شیءگرا است که به یک کلاس اجازه می‌دهد چندین متد با نام یکسان اما پارامترهای متفاوت داشته باشد. برای سربارگذاری یک متد، باید تعداد پارامترها یا نوع پارامترها یا هر دوی آن‌ها را تغییر دهیم.

سربارگذاری متد در پایتون

برخلاف زبان‌های برنامه‌نویسی دیگری مانند Java، C++ و C#، زبان پایتون به‌صورت پیش‌فرض از قابلیت سربارگذاری متد پشتیبانی نمی‌کند. با این حال، روش‌های جایگزینی برای دستیابی به این قابلیت وجود دارد.

مثال

اگر همان‌طور که در کد زیر نشان داده شده است، یک متد را چند بار تعریف کنید، آخرین تعریف جایگزین تعریف‌های قبلی خواهد شد. بنابراین، این روش برای پیاده‌سازی سربارگذاری متد در پایتون با خطا مواجه می‌شود.

class example:
   def add(self, a, b):
      x = a+b
      return x
   def add(self, a, b, c):
      x = a+b+c
      return x

obj = example()

print (obj.add(10,20,30))
print (obj.add(10,20))

فراخوانی اول متد add() با سه آرگومان با موفقیت انجام می‌شود. اما فراخوانی متد add() با دو آرگومان، مطابق با تعریفی که در کلاس انجام شده است، با خطا مواجه می‌شود.

60
Traceback (most recent call last):
 File "C:\Users\user\example.py", line 12, in <module>
  print (obj.add(10,20))
         ^^^^^^^^^^^^^^
TypeError: example.add() missing 1 required positional argument: 'c'

خروجی نشان می‌دهد که پایتون فقط آخرین تعریف متد add() را در نظر می‌گیرد و تعریف‌های قبلی را نادیده می‌گیرد.

برای شبیه‌سازی سربارگذاری متد، می‌توانیم از یک راهکار جایگزین استفاده کنیم: برای آرگومان‌های متد، مقدار پیش‌فرض None را تعیین کنیم تا متد بتواند با یک، دو یا سه آرگومان فراخوانی شود.

مثال

مثال زیر نشان می‌دهد که چگونه می‌توان سربارگذاری متد را در پایتون پیاده‌سازی کرد.

class example:
   def add(self, a = None, b = None, c = None):
      x=0
      if a !=None and b != None and c != None:
         x = a+b+c
      elif a !=None and b != None and c == None:
         x = a+b
      return x

obj = example()

print (obj.add(10,20,30))
print (obj.add(10,20))

خروجی زیر تولید خواهد شد:

60
30

با استفاده از این راهکار جایگزین، می‌توانیم قابلیت سربارگذاری متد را در یک کلاس پایتون پیاده‌سازی کنیم.

پیاده‌سازی سربارگذاری متد با استفاده از MultipleDispatch

کتابخانه استاندارد پایتون راهکار دیگری برای پیاده‌سازی سربارگذاری متد ارائه نمی‌دهد. با این حال، می‌توانیم برای این منظور از تابع dispatch در یک ماژول شخص ثالث به نام MultipleDispatch استفاده کنیم.

ابتدا باید ماژول Multipledispatch را با استفاده از دستور زیر نصب کنید.

pip install multipledispatch

این ماژول دارای دکوراتور @dispatch است. این دکوراتور تعداد آرگومان‌هایی را دریافت می‌کند که قرار است به متد موردنظر برای سربارگذاری ارسال شوند. همان‌طور که در ادامه نشان داده شده است، چند نسخه از متد add() را با دکوراتور @dispatch تعریف کنید.

مثال

در این مثال، از multipledispatch برای سربارگذاری یک متد در پایتون استفاده می‌کنیم.

from multipledispatch import dispatch
class example:
   @dispatch(int, int)
   def add(self, a, b):
      x = a+b
      return x
   @dispatch(int, int, int)
   def add(self, a, b, c):
      x = a+b+c
      return x

obj = example()

print (obj.add(10,20,30))
print (obj.add(10,20))

خروجی

60
30

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.