Przeciążanie funkcji może nie być wbudowane w Python, ale istnieją sposoby na jego naśladowanie.
Przeciążanie funkcji to funkcja dostępna w niektórych językach programowania, która umożliwia definiowanie odmian tej samej funkcji. Każdy wariant ma tę samą nazwę, ale różne implementacje i unikalne sygnatury funkcji.
Ta technika umożliwia wykonywanie różnych operacji w zależności od typu i liczby argumentów przekazanych do funkcji.
W przeciwieństwie do języków takich jak C++ i Java, Python domyślnie nie obsługuje przeciążania funkcji, ale istnieją sposoby na osiągnięcie podobnej funkcjonalności.
Jak Python radzi sobie z przeciążeniem funkcji?
W Pythonie możesz definiować tę samą funkcję więcej niż raz z różnymi parametrami, typami danych lub obydwoma w każdej definicji. Jednak Python rozpozna tylko ostatnią definicję funkcji, gdy ją wywołasz. Oto przykład:
defarithmetics(a, b):
return a - bdefarithmetics(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
Języki obiektowe, takie jak Java, często obsługują przeciążanie funkcji i metod. Metoda to po prostu funkcja zdefiniowana wewnątrz klasy.
W powyższym kodzie Python rozpozna tylko drugą definicję arytmetyka() funkcji, gdy próbujesz wywołać ją w swoim projekcie. Jeśli spróbujesz wywołać funkcję z dwoma argumentami, jak zdefiniowano na początku, pojawi się błąd „brak wymaganych argumentów pozycyjnych”.
Wywołanie funkcji z czterema argumentami nie spowoduje błędu. Oznacza to, że Python nadpisał funkcję najnowszą instancją. To nie jest zachowanie związane z przeciążeniem, więc musisz sobie z tym poradzić.
Tak więc Python domyślnie nie obsługuje przeciążania funkcji, ale istnieje kilka sztuczek, których możesz użyć do symulacji jego zachowania w swoich programach.
Metoda 1: Używanie parametrów opcjonalnych lub argumentów domyślnych
Przeciążenie można uzyskać, definiując funkcję z argumentami domyślnymi. Oto przykład:
defarithmetics(a, b=0, c=0):
Arguments:
a: The first number.
b: The second number (optional).
c: The third number (optional).
return a - b + c
Ta funkcja ma trzy parametry, ale dwa z nich mają wartości domyślne. Oznacza to, że możesz go wywołać z jednym do trzech argumentów:
print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11
Chociaż takie podejście pozwala wywołać funkcję na kilka różnych sposobów, na dłuższą metę nie jest zbyt skuteczne. Oto niektóre z jego ograniczeń:
- Można przekazywać tylko argumenty będące liczbami całkowitymi lub zmiennoprzecinkowymi.
- Nie ma znaczących zmian w zachowaniu funkcji. Na przykład nie można zmienić jego zachowania, aby obliczyć obszar kształtu, a nawet wydrukować Witaj świecie.
Metoda 2: Używanie zmiennych argumentów
Aby użyć zmiennych argumentów do przeciążania funkcji w Pythonie, powinieneś uwzględnij parametr args podczas definiowania funkcji. The argumenty Parametr umożliwia przekazanie wielu argumentów pozycyjnych podczas wywoływania funkcji. Oto przykład:
defarithmetics(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)) # returns 1
print(arithmetics(2, 5)) # returns 2
print(arithmetics(10, 3, 4, 2, 4, 6)) # returns 10
Powyższa funkcja przyjmuje dwa argumenty: argument obowiązkowy o nazwie A i argumenty argument, który umożliwia wprowadzenie dowolnej liczby argumentów.
Chociaż może przyjmować wiele argumentów, powyższa funkcja może wykonywać operację mnożenia tylko na argumentach zmiennych, tj. Argumentach reprezentowanych przez argumenty słowo kluczowe.
Jeśli chcesz wykonać wiele operacji, musisz to zrobić wprowadź do swojego kodu instrukcje warunkowe, a to może szybko się skomplikować.
Metoda 3: Korzystanie z dekoratora wielu wysyłek
Dekorator wielokrotnego wysyłania to biblioteka Pythona, która umożliwia definiowanie wielu implementacji lub instancji pojedynczej funkcji w oparciu o typ jej argumentów. Oznacza to, że możesz zdefiniować tę samą funkcję z różnymi typami danych i całkowicie zmienić jej zachowanie.
Aby użyć dekoratora wielu wysyłek, wykonaj następujące kroki:
- zainstalować wielościeżkowa w twoim środowisku Python:
pip install multipledispatch
- Udekoruj swoje funkcje za pomocą @załatwić dekorator. The @załatwić dekorator jest Dekorator Pythona co pozwala na realizację wielu wysyłek. Automatycznie wywoła odpowiednią funkcję na podstawie przekazanych jej argumentów. Możesz skorzystać z @załatwić dekorator, postępując zgodnie z tym wzorem:
from multipledispatch import dispatch
@dispatch(data type1, data type2, data typeX)
defyour_function(a, b, c, x):
pass
# perform your operations here
Oto przykład użycia dekoratora wielokrotnego wysyłania do przeciążania funkcji w Pythonie:
from multipledispatch import dispatch
@dispatch(int, int)
defadd(a, b):
Arguments:
a: Any integer.
b: Any integer.
return a + b@dispatch(int, list)
defadd(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']))
Powyższy fragment kodu definiuje dwa wystąpienia metody dodać() funkcjonować. Pierwsza instancja przyjmuje jako argumenty dwie liczby całkowite i zwraca ich sumę.
Tymczasem druga wersja tej funkcji przyjmuje liczbę całkowitą i listę. Dołącza liczbę całkowitą do listy i zwraca nową listę.
Takie podejście do przeciążania funkcji w Pythonie zapewnia dużą elastyczność, szczególnie jeśli chcesz zmienić zachowanie swojej metody. Więcej dowiesz się z wielokrotna dokumentacja wysyłkowa.
Najlepsze podejście do przeciążania funkcji w Pythonie
Podejście do przeciążania funkcji powinno zależeć od tego, co próbujesz osiągnąć. Jeśli możesz wykonać zadanie, używając argumentów domyślnych lub zmiennych, wówczas dekorator wielokrotnego wysyłania może być przesadą. Jednak dekorator wielu wysyłek jest zwykle najlepszą opcją ze względu na jego wydajność i dokładność.
Ten dekorator zapewnia przejrzysty i elastyczny sposób implementowania przeciążania funkcji w Pythonie. Umożliwia zdefiniowanie wielu implementacji pojedynczej funkcji w oparciu o typ jej argumentów.
Dzięki takiemu podejściu można tworzyć elastyczne funkcje, które akceptują różne typy parametrów bez potrzeby stosowania skomplikowanych instrukcji warunkowych.