ممکن است اضافه بار توابع در پایتون تعبیه نشده باشد، اما راه هایی برای تقلید از آن وجود دارد.
بارگذاری بیش از حد توابع یک ویژگی در برخی از زبان های برنامه نویسی است که به شما امکان می دهد تغییراتی از یک تابع را تعریف کنید. هر گونه نام یکسان، اما پیاده سازی های متفاوت، با امضاهای تابع منحصر به فرد دارد.
این تکنیک به شما امکان می دهد عملیات های مختلفی را بر اساس نوع و تعداد آرگومان های ارسال شده به یک تابع انجام دهید.
برخلاف زبانهایی مانند C++ و جاوا، پایتون بهطور پیشفرض از اضافهبار کردن توابع پشتیبانی نمیکند، اما راههایی برای دستیابی به عملکرد مشابه وجود دارد.
پایتون چگونه عملکرد اضافه بار را کنترل می کند؟
در پایتون، می توانید یک تابع را بیش از یک بار با پارامترها، انواع داده ها یا هر دو در هر تعریف مختلف تعریف کنید. با این حال، پایتون زمانی که تابع را فراخوانی میکنید، تنها آخرین تعریف آن را تشخیص میدهد. در اینجا یک مثال است:
def arithmetics(a, b):
return a - b
def arithmetics(a, b, c, d):
return a + b - c * d
print(arithmetics(1, 2, 3, 5)) # returns -12
print(arithmetics(1, 2)) # returns missing positional arguments error
زبان های شی گرا، مانند جاوا، اغلب از بارگذاری بیش از حد تابع و روش پشتیبانی می کنند. متد به سادگی تابعی است که شما در داخل یک کلاس تعریف می کنید.
در کد بالا، پایتون تنها زمانی تعریف دوم تابع () arithmetics را تشخیص می دهد که بخواهید آن را در پروژه خود فراخوانی کنید. اگر سعی کنید تابع را با دو آرگومان همانطور که در ابتدا تعریف شده است فراخوانی کنید، با خطایی مواجه خواهید شد که می گوید: “از دست دادن آرگومان های موقعیتی مورد نیاز”.
هنگام فراخوانی تابع با چهار آرگومان، خطایی دریافت نمی کنید. این بدان معنی است که پایتون تابع را با آخرین نمونه خود بازنویسی کرده است. این رفتار بارگذاری بیش از حد نیست، بنابراین باید با آن مقابله کنید.
بنابراین، پایتون بهطور پیشفرض با اضافه بار توابع مدیریت نمیکند، اما برخی از ترفندها وجود دارد که میتوانید برای شبیهسازی رفتار آن در برنامههای خود استفاده کنید.
روش 1: استفاده از پارامترهای اختیاری یا آرگومان های پیش فرض
شما می توانید با تعریف یک تابع با آرگومان های پیش فرض به بارگذاری بیش از حد دست پیدا کنید. در اینجا یک مثال است:
def arithmetics(a, b=0, c=0):
"""
Arguments:
a: The first number.
b: The second number (optional).
c: The third number (optional).
"""
return a - b + c
این تابع دارای سه پارامتر است، اما دو مورد از آنها دارای مقادیر پیش فرض هستند. این بدان معنی است که شما می توانید آن را با بین یک تا سه آرگومان فراخوانی کنید:
print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11
اگرچه این رویکرد به شما امکان می دهد تا تابع را به روش های مختلف فراخوانی کنید، اما در دراز مدت چندان موثر نیست. در اینجا برخی از محدودیت های آن وجود دارد:
- شما فقط می توانید آرگومان هایی را ارسال کنید که اعداد صحیح یا شناور هستند.
- هیچ تغییر قابل توجهی در رفتار تابع وجود ندارد. به عنوان مثال، شما نمی توانید رفتار آن را برای محاسبه مساحت یک شکل یا حتی چاپ Hello World تغییر دهید.
روش 2: استفاده از آرگومان های متغیر
برای استفاده از آرگومان های متغیر برای بارگذاری بیش از حد تابع در پایتون، باید پارامتر args را هنگام تعریف تابع خود وارد کنید. پارامتر args به شما این امکان را می دهد که هنگام فراخوانی تابع خود چندین آرگومان موقعیتی را ارسال کنید. در اینجا یک مثال است:
def arithmetics(a, *args):
"""
Arguments:
a: The first number.
*args: A variable number of arguments (optional).
"""
args_sum = 0
for num in args:
args_sum *= num
return a - args_sum
print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns 2
print(arithmetics(10, 3, 4, 2, 4, 6)) # returns 10
تابع بالا دو آرگومان می گیرد: یک آرگومان اجباری به نام a و آرگومان args، که به شما امکان می دهد هر تعداد آرگومان را که نیاز دارید وارد کنید.
اگرچه میتواند چندین آرگومان بگیرد، تابع بالا فقط میتواند عملیات ضرب را روی آرگومانهای متغیر انجام دهد، یعنی آرگومانهایی که با کلمه کلیدی args نشان داده میشوند.
اگر می خواهید چندین عملیات را انجام دهید، باید دستورات شرطی را به کد خود وارد کنید، و این می تواند به سرعت پیچیده شود.
روش 3: استفاده از دکوراتور چندگانه
دکوراتور ارسال چندگانه یک کتابخانه پایتون است که به شما امکان می دهد چندین پیاده سازی یا نمونه از یک تابع را بر اساس نوع آرگومان های آن تعریف کنید. این بدان معنی است که شما می توانید یک تابع را با انواع داده های مختلف تعریف کنید و رفتار آن را به طور کامل تغییر دهید.
برای استفاده از دکوراتور چندگانه، مراحل زیر را دنبال کنید:
- Multidispath را در محیط پایتون خود نصب کنید: pip install multipledispatch
- عملکرد(های) خود را با دکوراتور @dispatch تزئین کنید. دکوراتور @dispatch یک دکوراتور پایتون است که به شما امکان می دهد چندین ارسال را پیاده سازی کنید. به طور خودکار تابع مناسب را بر اساس آرگومان هایی که به آن ارسال می کنید ارسال می کند. میتوانید با پیروی از این الگو از تزیینکننده @dispatch استفاده کنید: from multipledispatch import dispatch@dispatch (داده نوع 1، نوع داده 2، نوع داده X) تابع your_function (a، b، c، x): pass # عملیات خود را در اینجا انجام دهید
pip install multipledispatch
from multipledispatch import dispatch
@dispatch(data type1, data type2, data typeX)
def your_function(a, b, c, x):
pass
# perform your operations here
در اینجا مثالی آورده شده است که از دکوراتور چندگانه برای بارگذاری بیش از حد تابع در پایتون استفاده می کند:
from multipledispatch import dispatch
@dispatch(int, int)
def add(a, b):
"""
Arguments:
a: Any integer.
b: Any integer.
"""
return a + b
@dispatch(int, list)
def add(a, b):
"""
Arguments:
a: Any integer.
b: Any Python list.
"""
b.append(a)
return b
# returns 3
print(add(1, 2))
# returns [2, 3, 4, 5, 'w', 'done', 1]
print(add(1, [2, 3, 4, 5, 'w', 'done']))
قطعه کد بالا دو نمونه از تابع add() را تعریف می کند. نمونه اول دو عدد صحیح را به عنوان آرگومان های خود می گیرد و مجموع آنها را برمی گرداند.
در همین حال، نسخه دوم این تابع یک عدد صحیح و یک لیست می گیرد. عدد صحیح را به لیست اضافه می کند و لیست جدید را برمی گرداند.
این رویکرد برای بارگذاری بیش از حد توابع در پایتون به شما انعطاف پذیری زیادی می دهد، به خصوص اگر نیاز به تغییر رفتار روش خود داشته باشید. می توانید از اسناد ارسال چندگانه بیشتر بیاموزید.
بهترین رویکرد برای بارگذاری بیش از حد توابع در پایتون
رویکردی که برای بارگذاری بیش از حد عملکرد در نظر می گیرید باید به آنچه می خواهید به آن برسید بستگی دارد. اگر میتوانید کار خود را با استفاده از آرگومانهای پیشفرض یا متغیر تکمیل کنید، ممکن است دکوراتور ارسال چندگانه بیش از حد باشد. با این حال، دکوراتور چندگانه معمولاً بهترین گزینه برای کارایی و دقت آن است.
این دکوراتور روشی تمیز و منعطف برای اجرای اضافه بار عملکرد در پایتون ارائه می دهد. این به شما امکان می دهد پیاده سازی های متعدد یک تابع را بر اساس نوع آرگومان های آن تعریف کنید.
با این رویکرد، میتوانید توابع انعطافپذیری ایجاد کنید که میتوانند انواع پارامترهای مختلف را بدون نیاز به عبارات شرطی پیچیده بپذیرند.