Funkcijų perkrovimas gali būti neįtrauktas į Python, tačiau yra būdų, kaip jį imituoti.

Funkcijų perkrovimas yra kai kurių programavimo kalbų funkcija, leidžianti apibrėžti tos pačios funkcijos variantus. Kiekvienas variantas turi tą patį pavadinimą, bet skirtingus įgyvendinimus su unikaliais funkcijų parašais.

Ši technika leidžia atlikti įvairias operacijas, atsižvelgiant į funkcijai perduodamų argumentų tipą ir skaičių.

Skirtingai nuo kalbų, tokių kaip C++ ir Java, Python nepalaiko funkcijų perkrovimo pagal numatytuosius nustatymus, tačiau yra būdų, kaip pasiekti panašias funkcijas.

Kaip Python susidoroja su funkcijų perkrovimu?

„Python“ galite apibrėžti tą pačią funkciją daugiau nei vieną kartą naudodami skirtingus parametrus, duomenų tipus arba abu kiekviename apibrėžime. Tačiau „Python“ atpažins tik paskutinį funkcijos apibrėžimą, kai ją iškviesite. Štai pavyzdys:

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

Objektinės kalbos, tokios kaip „Java“, dažnai palaiko funkcijų ir metodų perkrovimą. Metodas yra tiesiog funkcija, kurią apibrėžiate klasėje.

Aukščiau pateiktame kode Python atpažins tik antrąjį apibrėžimą aritmetika () funkcija, kai bandote ją pavadinti savo projekte. Jei bandysite iškviesti funkciją su dviem argumentais, kaip apibrėžta pirmą kartą, gausite klaidą, kuri sako: „trūksta būtinų pozicijos argumentų“.

Negausite klaidos, kai iškviesite funkciją su keturiais argumentais. Tai reiškia, kad „Python“ perrašė funkciją naudodami naujausią egzempliorių. Tai nėra perkrovos elgesys, todėl turite su tuo kovoti.

Taigi pagal numatytuosius nustatymus „Python“ neapdoroja funkcijų perkrovimo, tačiau yra keletas gudrybių, kurias galite naudoti norėdami imituoti jo elgesį savo programose.

1 būdas: pasirenkamų parametrų arba numatytųjų argumentų naudojimas

Perkrovą galite pasiekti apibrėžę funkciją su numatytaisiais argumentais. Štai pavyzdys:

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

Ši funkcija turi tris parametrus, tačiau du iš jų turi numatytąsias reikšmes. Tai reiškia, kad galite jį vadinti nuo vieno iki trijų argumentų:

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

Nors šis metodas leidžia iškviesti funkciją keliais skirtingais būdais, ilgainiui jis nėra labai efektyvus. Štai keletas jo apribojimų:

  • Galite perduoti tik sveikuosius arba slankiuosius argumentus.
  • Funkcijos elgesyje reikšmingų pokyčių nėra. Pavyzdžiui, negalite pakeisti jos veikimo, kad apskaičiuotumėte formos plotą ar net spausdintumėte Labas pasauli.

2 būdas: kintamųjų argumentų naudojimas

Jei norite naudoti kintamuosius argumentus, skirtus funkcijų perkrovimui Python, turėtumėte apibrėždami funkciją įtraukite parametrą args. The args parametras leidžia perduoti kelis pozicijos argumentus iškviečiant funkciją. Štai pavyzdys:

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

Aukščiau pateikta funkcija turi du argumentus: privalomą argumentą a ir args argumentas, leidžiantis įvesti tiek argumentų, kiek jums reikia.

Nors jai gali prireikti kelių argumentų, aukščiau pateikta funkcija gali atlikti tik kintamųjų argumentų daugybos operaciją, t. y. argumentus, pateiktus args raktažodį.

Jei norite atlikti kelias operacijas, turite į savo kodą įtraukite sąlyginius teiginius, ir tai gali greitai pasidaryti sudėtinga.

3 būdas: kelių siuntimo dekoratoriaus naudojimas

Kelių siuntimo dekoratorius yra Python biblioteka, leidžianti apibrėžti kelis vienos funkcijos įgyvendinimus arba egzempliorius, atsižvelgiant į jos argumentų tipą. Tai reiškia, kad galite apibrėžti tą pačią funkciją su skirtingais duomenų tipais ir visiškai pakeisti jos veikimą.

Norėdami naudoti kelių siuntimo dekoratorių, atlikite šiuos veiksmus:

  1. Diegti daugialypė dispatija jūsų Python aplinkoje:
    pip install multipledispatch
  2. Papuoškite savo funkciją (-as) su @išsiuntimas dekoratorius. The @išsiuntimas dekoratorius yra a Python dekoratorius kuri leidžia įgyvendinti kelis siuntimus. Ji automatiškai išsiųs atitinkamą funkciją pagal argumentus, kuriuos jai perduosite. Galite naudoti @išsiuntimas dekoratorius, vadovaudamasis šiuo modeliu:
    from multipledispatch import dispatch

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

Štai pavyzdys, kuris naudoja kelių siuntimo dekoratorių funkcijoms perkrauti Python:

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

Aukščiau pateiktas kodo fragmentas apibrėžia du egzempliorius papildyti() funkcija. Pirmuoju atveju argumentais paimami du sveikieji skaičiai ir grąžinama jų suma.

Tuo tarpu antroji šios funkcijos versija apima sveikąjį skaičių ir sąrašą. Prie sąrašo pridedamas sveikasis skaičius ir pateikiamas naujas sąrašas.

Šis „Python“ funkcijų perkrovimo metodas suteikia daug lankstumo, ypač jei reikia pakeisti metodo veikimą. Galite sužinoti daugiau iš daugkartinio siuntimo dokumentai.

Geriausias požiūris į funkcijų perkrovimą „Python“.

Požiūris, kurio laikotės perkraunant funkciją, turėtų priklausyti nuo to, ką bandote pasiekti. Jei galite atlikti užduotį naudodami numatytuosius arba kintamuosius argumentus, kelių siuntimo dekoravimo priemonė gali būti perdėta. Tačiau daugkartinio siuntimo dekoratorius paprastai yra geriausias pasirinkimas dėl savo efektyvumo ir tikslumo.

Šis dekoratorius yra švarus ir lankstus būdas įdiegti funkcijų perkrovą Python. Tai leidžia apibrėžti kelis vienos funkcijos įgyvendinimus, atsižvelgiant į jos argumentų tipą.

Taikydami šį metodą galite sukurti lanksčias funkcijas, kurios gali priimti skirtingus parametrų tipus be sudėtingų sąlyginių teiginių.