Preopterećenje funkcija možda nije ugrađeno u Python, ali postoje načini da se to oponaša.

Preopterećenje funkcija značajka je u nekim programskim jezicima koja vam omogućuje definiranje varijacija iste funkcije. Svaka varijanta ima isto ime, ali različite implementacije, s jedinstvenim potpisima funkcija.

Ova tehnika vam omogućuje izvođenje različitih operacija na temelju vrste i broja argumenata proslijeđenih funkciji.

Za razliku od jezika kao što su C++ i Java, Python ne podržava preopterećenje funkcija prema zadanim postavkama, ali postoje načini za postizanje slične funkcionalnosti.

Kako Python rješava preopterećenje funkcija?

U Pythonu možete definirati istu funkciju više puta s različitim parametrima, tipovima podataka ili oboje u svakoj definiciji. Međutim, Python će prepoznati samo posljednju definiciju funkcije kada je pozovete. Evo primjera:

defarithmetics(a, b):
return a - b

defarithmetics(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

instagram viewer

Objektno orijentirani jezici, poput Jave, često podržavaju preopterećenje funkcija i metoda. Metoda je jednostavno funkcija koju definirate unutar klase.

U gornjem kodu, Python će prepoznati samo drugu definiciju aritmetika() funkciju kada je pokušate pozvati u svom projektu. Ako pokušate pozvati funkciju s dva argumenta kako je prvo definirano, dobit ćete pogrešku koja kaže "nedostaju potrebni pozicijski argumenti".

Nećete dobiti pogrešku kada pozovete funkciju s četiri argumenta. To znači da je Python prebrisao funkciju svojom posljednjom instancom. Ovo nije ponašanje preopterećenja, pa se s tim morate pozabaviti.

Dakle, Python ne rješava preopterećenje funkcija prema zadanim postavkama, ali postoje neki trikovi koje možete koristiti za simulaciju njegovog ponašanja u svojim programima.

Metoda 1: Korištenje izbornih parametara ili zadanih argumenata

Preopterećenje možete postići definiranjem funkcije sa zadanim argumentima. Evo primjera:

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

Ova funkcija ima tri parametra, ali dva od njih imaju zadane vrijednosti. To znači da ga možete pozvati s jednim do tri argumenta:

print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11

Iako vam ovaj pristup omogućuje pozivanje funkcije na nekoliko različitih načina, dugoročno nije učinkovit. Evo nekih njegovih ograničenja:

  • Možete proslijediti samo argumente koji su cijeli brojevi ili brojevi s pomičnim brojem.
  • Nema značajne promjene u ponašanju funkcije. Na primjer, ne možete promijeniti njegovo ponašanje da biste izračunali površinu oblika ili čak ispisali Pozdrav svijete.

Metoda 2: Korištenje varijabilnih argumenata

Da biste koristili promjenjive argumente za preopterećenje funkcija u Pythonu, trebali biste uključite parametar args kada definirate svoju funkciju. The args parametar vam omogućuje prosljeđivanje višestrukih pozicijskih argumenata prilikom poziva vaše funkcije. Evo primjera:

defarithmetics(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

Gornja funkcija uzima dva argumenta: obavezni argument tzv a i args argument, koji vam omogućuje unos onoliko argumenata koliko vam je potrebno.

Iako može uzeti više argumenata, gornja funkcija može izvršiti operaciju množenja samo na varijabilnim argumentima, tj. argumentima predstavljenim args ključna riječ.

Ako želite izvesti više operacija, morate uvedite uvjetne naredbe u svoj kod, a to se brzo može zakomplicirati.

Metoda 3: Korištenje višestrukog dekoratora slanja

Dekorator višestruke otpreme je Python biblioteka koja vam omogućuje da definirate višestruke implementacije ili instance jedne funkcije, na temelju vrste njenih argumenata. To znači da možete definirati istu funkciju s različitim vrstama podataka i u potpunosti promijeniti njezino ponašanje.

Da biste koristili dekorator višestruke otpreme, slijedite ove korake:

  1. Instalirati višestruki dispat u vašem Python okruženju:
    pip install multipledispatch
  2. Ukrasite svoju funkciju(e) s @otprema dekorater. The @otprema dekorater je a Python dekorater koji vam omogućuje implementaciju višestrukog slanja. Automatski će poslati odgovarajuću funkciju na temelju argumenata koje joj proslijedite. Možete koristiti @otprema dekorater slijedeći ovaj obrazac:
    from multipledispatch import dispatch

    @dispatch(data type1, data type2, data typeX)
    defyour_function(a, b, c, x):
    pass
    # perform your operations here

Evo primjera koji koristi višestruki dekorator otpreme za preopterećenje funkcija u Pythonu:

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']))

Gornji isječak koda definira dvije instance dodati() funkcija. Prva instanca uzima dva cijela broja kao svoje argumente i vraća njihov zbroj.

U međuvremenu, druga verzija ove funkcije uzima cijeli broj i popis. Dodaje cijeli broj popisu i vraća novi popis.

Ovaj pristup preopterećenju funkcija u Pythonu daje vam puno fleksibilnosti, osobito ako trebate promijeniti ponašanje svoje metode. Možete saznati više od višestruka otpremna dokumentacija.

Najbolji pristup preopterećenju funkcija u Pythonu

Pristup koji koristite preopterećenju funkcija trebao bi ovisiti o tome što pokušavate postići. Ako svoj zadatak možete dovršiti korištenjem zadanih ili varijabilnih argumenata, dekorator višestruke otpreme mogao bi biti pretjeran. Međutim, dekorater višestruke otpreme obično je najbolja opcija zbog svoje učinkovitosti i točnosti.

Ovaj dekorater pruža čist i fleksibilan način za implementaciju preopterećenja funkcija u Pythonu. Omogućuje vam definiranje više implementacija jedne funkcije na temelju vrste njezinih argumenata.

Ovim pristupom možete stvoriti fleksibilne funkcije koje mogu prihvatiti različite vrste parametara bez potrebe za složenim uvjetnim izjavama.