Funktsioonide ülekoormus ei pruugi olla Pythoni sisse ehitatud, kuid selle jäljendamiseks on võimalusi.
Funktsioonide ülekoormus on mõnes programmeerimiskeeles funktsioon, mis võimaldab määratleda sama funktsiooni variatsioone. Igal variandil on sama nimi, kuid erinevad teostused ja ainulaadsed funktsioonisignatuurid.
See meetod võimaldab teil teha erinevaid toiminguid, mis põhinevad funktsioonile edastatud argumentide tüübil ja arvul.
Erinevalt keeltest nagu C++ ja Java, ei toeta Python vaikimisi funktsioonide ülekoormamist, kuid sarnase funktsionaalsuse saavutamiseks on võimalusi.
Kuidas Python funktsioonide ülekoormamisega hakkama saab?
Pythonis saate defineerida sama funktsiooni mitu korda, kasutades igas definitsioonis erinevaid parameetreid, andmetüüpe või mõlemat. Siiski tunneb Python ära ainult funktsiooni viimase definitsiooni, kui seda kutsute. Siin on näide:
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
Objektorienteeritud keeled, nagu Java, toetavad sageli funktsioonide ja meetodite ülekoormamist. Meetod on lihtsalt funktsioon, mille määratlete klassi sees.
Ülaltoodud koodis tunneb Python ära ainult teise definitsiooni aritmeetika() funktsiooni, kui proovite seda oma projektis kutsuda. Kui proovite funktsiooni kutsuda kahe algselt määratletud argumendiga, kuvatakse tõrketeade "vajalikud positsiooniargumendid puuduvad".
Te ei saa veateadet, kui kutsute funktsiooni nelja argumendiga. See tähendab, et Python on funktsiooni oma viimase eksemplariga üle kirjutanud. See ei ole ülekoormuse käitumine, seega peate sellega tegelema.
Seega ei tegele Python funktsioonide ülekoormamisega vaikimisi, kuid on mõningaid nippe, mille abil saate selle käitumist oma programmides simuleerida.
1. meetod: valikuliste parameetrite või vaikeargumentide kasutamine
Ülekoormamise saate saavutada, kui määratlete funktsiooni vaikeargumentidega. Siin on näide:
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
Sellel funktsioonil on kolm parameetrit, kuid kahel neist on vaikeväärtused. See tähendab, et saate seda nimetada ühe kuni kolme argumendiga:
print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11
Kuigi see lähenemisviis võimaldab funktsiooni kutsuda mitmel erineval viisil, pole see pikas perspektiivis kuigi tõhus. Siin on mõned selle piirangud:
- Saate edastada ainult argumendid, mis on täisarvud või ujukid.
- Funktsiooni käitumises olulisi muutusi ei toimu. Näiteks ei saa te muuta selle käitumist kujundi pindala arvutamiseks või isegi printimiseks Tere, Maailm.
2. meetod: muutujaargumentide kasutamine
Muutuvate argumentide kasutamiseks Pythonis funktsioonide ülekoormuse jaoks peaksite seda tegema funktsiooni määratlemisel kaasake parameeter args. The args parameeter võimaldab teil funktsiooni kutsumisel edastada mitu positsiooniargumenti. Siin on näide:
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
Ülaltoodud funktsioonil on kaks argumenti: kutsutud kohustuslik argument a ja args argument, mis võimaldab sisestada nii palju argumente kui vaja.
Kuigi see võib võtta mitu argumenti, saab ülaltoodud funktsioon sooritada korrutamistoimingu ainult muutuja argumentidega, st argumentidega, mida esindab args märksõna.
Kui soovite teha mitu toimingut, peate seda tegema lisage oma koodile tingimuslausedja see võib kiiresti keeruliseks muutuda.
3. meetod: Multiple Dispatch Decoratori kasutamine
Mitme saatmise dekoraator on Pythoni teek, mis võimaldab määratleda ühe funktsiooni mitu rakendust või eksemplari selle argumentide tüübi alusel. See tähendab, et saate määratleda sama funktsiooni erinevate andmetüüpidega ja muuta selle käitumist täielikult.
Mitme saatmise dekoraatori kasutamiseks toimige järgmiselt.
- Installige multidispath teie Pythoni keskkonnas:
pip install multipledispatch
- Kaunistage oma funktsioonid @saatmine dekoraator. The @saatmine dekoraator on a Pythoni dekoraator mis võimaldab teil rakendada mitut saatmist. See saadab automaatselt sobiva funktsiooni, tuginedes sellele edastatud argumentidele. Võite kasutada @saatmine dekoraator, järgides seda mustrit:
from multipledispatch import dispatch
@dispatch(data type1, data type2, data typeX)
defyour_function(a, b, c, x):
pass
# perform your operations here
Siin on näide, mis kasutab Pythonis funktsioonide ülekoormamiseks mitme saatmise dekoraatorit:
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']))
Ülaltoodud koodilõik määratleb kaks eksemplari lisama() funktsiooni. Esimene instants võtab oma argumendiks kaks täisarvu ja tagastab nende summa.
Vahepeal võtab selle funktsiooni teine versioon täisarvu ja loendi. See lisab loendile täisarvu ja tagastab uue loendi.
Selline lähenemine funktsioonide ülekoormamisele Pythonis annab teile palju paindlikkust, eriti kui peate oma meetodi käitumist muutma. Lisateavet saate aadressilt mitmekordse lähetamise dokumentatsioon.
Parim lähenemine funktsioonide ülekoormamisele Pythonis
Ülekoormamise toimimise lähenemisviis peaks sõltuma sellest, mida proovite saavutada. Kui saate oma ülesande lõpule viia vaike- või muutuvate argumentide abil, võib mitmekordse saatmise dekoraator olla üle jõu käiv. Kuid mitmekordse lähetusega dekoraator on tavaliselt oma tõhususe ja täpsuse jaoks parim valik.
See dekoraator pakub puhta ja paindliku viisi funktsioonide ülekoormuse rakendamiseks Pythonis. See võimaldab teil määratleda ühe funktsiooni mitu rakendust selle argumentide tüübi alusel.
Selle lähenemisviisi abil saate luua paindlikke funktsioone, mis aktsepteerivad erinevaid parameetritüüpe, ilma et oleks vaja keerulisi tingimuslauseid.