Перевантаження функцій — це функція в деяких мовах програмування, яка дозволяє визначати варіанти однієї функції. Кожен варіант має однакову назву, але різні реалізації з унікальними функціональними підписами.
Ця техніка дозволяє виконувати різні операції залежно від типу та кількості аргументів, переданих функції.
На відміну від таких мов, як C++ і Java, Python не підтримує перевантаження функцій за замовчуванням, але є способи досягти подібної функціональності.
Як Python справляється з перевантаженням функцій?
У Python ви можете визначати ту саму функцію кілька разів з різними параметрами, типами даних або тим і іншим у кожному визначенні. Однак Python розпізнає лише останнє визначення функції, коли ви її викликаєте. Ось приклад:
def arithmetics(a, b):
return a - bdef arithmetics(a, b, c, d):
return a + b - c * dprint(arithmetics(1, 2, 3, 5))
print(arithmetics(1, 2))
Об’єктно-орієнтовані мови, такі як Java, часто підтримують перевантаження функцій і методів. Метод — це просто функція, яку ви визначаєте всередині класу.
У наведеному вище коді Python розпізнає лише друге визначення функції arithmetics(), коли ви спробуєте викликати її у своєму проекті. Якщо ви спробуєте викликати функцію з двома аргументами, визначеними спочатку, ви отримаєте повідомлення про помилку «відсутні необхідні позиційні аргументи».
Ви не отримаєте повідомлення про помилку, якщо викличете функцію з чотирма аргументами. Це означає, що Python перезаписав функцію її останнім екземпляром. Це не поведінка перевантаження, тому вам потрібно з цим боротися.
Отже, Python не обробляє перевантаження функцій за замовчуванням, але є деякі хитрощі, які можна використовувати, щоб імітувати його поведінку у ваших програмах.
Спосіб 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))
print(arithmetics(2, 5))
print(arithmetics(10, 3, 4))
Хоча цей підхід дозволяє викликати функцію декількома різними способами, у довгостроковій перспективі він не дуже ефективний. Ось деякі з його обмежень:
- Ви можете передавати лише цілі чи числа з плаваючою речовиною.
- Немає істотних змін у поведінці функції. Наприклад, ви не можете змінити його поведінку, щоб обчислити площу фігури або навіть надрукувати Hello World.
Спосіб 2: Використання змінних аргументів
Щоб використовувати змінні аргументи для перевантаження функції в Python, ви повинні включити параметр args під час визначення вашої функції. Параметр args дозволяє передавати кілька позиційних аргументів під час виклику вашої функції. Ось приклад:
def arithmetics(a, *args):
"""
Arguments:
a: The first number.
*args: A variable number of arguments (optional).
"""
args_sum = 0for num in args:
args_sum *= numreturn a - args_sum
print(arithmetics(1))
print(arithmetics(2, 5))
print(arithmetics(10, 3, 4, 2, 4, 6))
Наведена вище функція приймає два аргументи: обов’язковий аргумент під назвою a та аргумент args, який дозволяє вводити скільки завгодно аргументів.
Хоча вона може приймати кілька аргументів, наведена вище функція може виконувати операцію множення лише над змінними аргументами, тобто аргументами, представленими ключовим словом args.
Якщо ви хочете виконати кілька операцій, вам доведеться ввести умовні оператори у свій код, і це може швидко ускладнитися.
Спосіб 3: Використання декоратора кількох відправок
Декоратор кількох відправок — це бібліотека Python, яка дозволяє визначати кілька реалізацій або екземплярів однієї функції на основі типу її аргументів. Це означає, що ви можете визначити ту саму функцію з різними типами даних і повністю змінити її поведінку.
Щоб використовувати декоратор кількох розсилок, виконайте такі дії:
pip install multipledispatch
from multipledispatch import dispatch@dispatch(data type1, data type2, data typeX)
def your_function(a, b, c, x):
pass
Ось приклад, у якому використовується декоратор множинної відправки для перевантаження функцій у Python:
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
print(add(1, 2))
print(add(1, [2, 3, 4, 5, 'w', 'done']))
Наведений вище фрагмент коду визначає два екземпляри функції add(). Перший екземпляр приймає два цілі числа як аргументи та повертає їх суму.
Тим часом друга версія цієї функції приймає ціле число та список. Він додає ціле число до списку та повертає новий список.
Цей підхід до перевантаження функцій у Python дає вам велику гнучкість, особливо якщо вам потрібно змінити поведінку вашого методу. Ви можете дізнатися більше з багаторазова відправна документація.
Найкращий підхід до перевантаження функцій у Python
Підхід до перевантаження функцій має залежати від того, чого ви намагаєтеся досягти. Якщо ви можете завершити своє завдання, використовуючи аргументи за замовчуванням або змінні, тоді декоратор кількох відправок може бути надмірним. Проте декоратор багаторазової відправки зазвичай є найкращим варіантом з огляду на його ефективність і точність.
Цей декоратор забезпечує простий і гнучкий спосіб реалізації перевантаження функцій у Python. Він дозволяє визначати кілька реалізацій однієї функції на основі типу її аргументів.
За допомогою такого підходу ви можете створювати гнучкі функції, які можуть приймати різні типи параметрів без необхідності складних умовних операторів.