Czy w Pythonie można mieć przeciążone funkcje? W C # zrobiłbym coś takiego
void myfunction (int first, string second)
{
//some code
}
void myfunction (int first, string second , float third)
{
//some different code
}
a potem, gdy wywołuję funkcję, rozróżnia te dwie na podstawie liczby argumentów. Czy można zrobić coś podobnego w Pythonie?
Odpowiedzi:
EDYCJA Aby zapoznać się z nowymi funkcjami ogólnymi do pojedynczego wysyłania w Pythonie 3.4, zobacz http://www.python.org/dev/peps/pep-0443/
Zwykle nie ma potrzeby przeciążania funkcji w Pythonie. Python jest typowany dynamicznie i obsługuje opcjonalne argumenty funkcji.
def myfunction(first, second, third = None): if third is None: #just use first and second else: #use all three myfunction(1, 2) # third will be None, so enter the 'if' clause myfunction(3, 4, 5) # third isn't None, it's 5, so enter the 'else' clause
źródło
w normalnym Pythonie nie możesz robić tego, co chcesz. istnieją dwa bliskie przybliżenia:
def myfunction(first, second, *args): # args is a tuple of extra arguments def myfunction(first, second, third=None): # third is optional
jeśli jednak naprawdę chcesz to zrobić, z pewnością możesz sprawić, że zadziała (ryzykując urazę tradycjonalistów; o). w skrócie, można napisać
wrapper(*args)
funkcję, która sprawdza odpowiednio liczbę argumentów i delegatów. ten rodzaj „hakowania” jest zwykle wykonywany za pomocą dekoratorów. w tym przypadku możesz osiągnąć coś takiego:from typing import overload @overload def myfunction(first): .... @myfunction.overload def myfunction(first, second): .... @myfunction.overload def myfunction(first, second, third): ....
i zaimplementowałbyś to, sprawiając, że
overload(first_fn)
funkcja (lub konstruktor) zwraca wywoływalny obiekt, w którym__call__(*args)
metoda wykonuje delegację wyjaśnioną powyżej, aoverload(another_fn)
metoda dodaje dodatkowe funkcje, które mogą być delegowane.możesz zobaczyć przykład czegoś podobnego tutaj http://acooke.org/pytyp/pytyp.spec.dispatch.html, ale jest to przeciążanie metod według typu. to bardzo podobne podejście ...
UPDATE: i coś podobnego (używając typów argumentów) jest dodawane do Pythona 3 - http://www.python.org/dev/peps/pep-0443/
źródło
range
Wbudowane wykorzystuje przeciążenie, więc jest to naprawdę hack? github.com/python/typeshed/blob/master/stdlib/2and3/…Tak, to możliwe. Poniżej napisałem kod w Pythonie 3.2.1:
def overload(*functions): return lambda *args, **kwargs: functions[len(args)](*args, **kwargs)
Stosowanie:
Zwróć uwagę, że lambda zwracane przez
overload
funkcje wybierają funkcję do wywołania w zależności od liczby nienazwanych argumentów.Rozwiązanie nie jest idealne, ale w tej chwili nie mogę napisać nic lepszego.
źródło
Niemożliwe bezpośrednio. Możesz jednak użyć jawnego sprawdzenia typu dla podanych argumentów, chociaż generalnie jest to mile widziane.
Python jest dynamiczny. Jeśli nie jesteś pewien, co może zrobić obiekt, po prostu spróbuj: i wywołaj na nim metodę, a następnie z wyjątkiem: błędów.
Jeśli nie musisz przeciążać na podstawie typów, ale tylko na podstawie liczby argumentów, użyj argumentów słów kluczowych.
źródło
przeciążanie metod jest trudne w Pythonie. Jednak może być użycie przekazywania dyktowania, listy lub zmiennych pierwotnych.
Próbowałem czegoś dla moich przypadków użycia, może to pomóc w zrozumieniu ludzi, którzy przeciążają metody.
Weźmy przykład użycia w jednym z wątków stackoverflow:
metoda przeciążania klasy z wywołaniem metod z innej klasy.
def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):
przekazać argumenty ze zdalnej klasy:
add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},accelaration=10.6}
LUB
add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},speed=['10','20,'30']}
Tak więc obsługa zmiennych list, słownikowych lub prymitywnych jest uzyskiwana w wyniku przeciążenia metod.
wypróbuj to dla swoich kodów
źródło