Preobremenitev funkcij morda ni vgrajena v Python, vendar obstajajo načini za posnemanje.
Preobremenitev funkcij je funkcija v nekaterih programskih jezikih, ki vam omogoča definiranje različic iste funkcije. Vsaka različica ima isto ime, vendar različne izvedbe z edinstvenimi podpisi funkcij.
Ta tehnika vam omogoča izvajanje različnih operacij glede na vrsto in število argumentov, posredovanih funkciji.
Za razliko od jezikov, kot sta C++ in Java, Python privzeto ne podpira preobremenitve funkcij, vendar obstajajo načini za doseganje podobne funkcionalnosti.
Kako Python obravnava preobremenitev funkcij?
V Pythonu lahko definirate isto funkcijo več kot enkrat z različnimi parametri, vrstami podatkov ali obojim v vsaki definiciji. Vendar bo Python prepoznal le zadnjo definicijo funkcije, ko jo pokličete. Tukaj je primer:
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
Objektno usmerjeni jeziki, kot je Java, pogosto podpirajo preobremenitev funkcij in metod. Metoda je preprosto funkcija, ki jo definirate znotraj razreda.
V zgornji kodi bo Python prepoznal samo drugo definicijo aritmetika() funkcijo, ko jo poskušate poklicati v svojem projektu. Če poskusite poklicati funkcijo z dvema argumentoma, kot sta bila najprej definirana, boste prejeli napako, ki pravi "manjkajo zahtevani pozicijski argumenti".
Ko funkcijo pokličete s štirimi argumenti, ne boste dobili napake. To pomeni, da je Python prepisal funkcijo z zadnjim primerkom. To ni preobremenitev, zato se morate tega lotiti.
Torej Python privzeto ne obravnava preobremenitve funkcij, vendar obstaja nekaj trikov, s katerimi lahko simulirate njegovo vedenje v svojih programih.
1. način: Uporaba neobveznih parametrov ali privzetih argumentov
Preobremenitev lahko dosežete tako, da definirate funkcijo s privzetimi argumenti. Tukaj je primer:
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 funkcija ima tri parametre, vendar imata dva privzete vrednosti. To pomeni, da ga lahko pokličete z enim do tremi argumenti:
print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11
Čeprav vam ta pristop omogoča, da funkcijo pokličete na več različnih načinov, dolgoročno ni zelo učinkovit. Tukaj je nekaj njegovih omejitev:
- Posredujete lahko le argumente, ki so bodisi cela števila ali lebdeči.
- V obnašanju funkcije ni bistvenih sprememb. Na primer, ne morete spremeniti njegovega vedenja za izračun površine oblike ali celo za tiskanje Pozdravljen, svet.
2. način: Uporaba spremenljivih argumentov
Če želite uporabiti spremenljive argumente za preobremenitev funkcij v Pythonu, bi morali vključite parameter args, ko definirate svojo funkcijo. The args omogoča posredovanje več pozicijskih argumentov pri klicu vaše funkcije. Tukaj je primer:
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
Zgornja funkcija sprejme dva argumenta: poklicani obvezni argument a in args argument, ki vam omogoča, da vnesete toliko argumentov, kot jih potrebujete.
Čeprav lahko prejme več argumentov, lahko zgornja funkcija izvede samo operacijo množenja spremenljivih argumentov, tj. argumentov, ki jih predstavlja args ključna beseda.
Če želite izvesti več operacij, morate uvedite pogojne stavke v svojo kodo, to pa se lahko hitro zaplete.
3. način: Uporaba okraševalca več odprem
Dekorater večkratnega pošiljanja je knjižnica Python, ki vam omogoča definiranje več izvedb ali primerkov ene same funkcije glede na vrsto njenih argumentov. To pomeni, da lahko definirate isto funkcijo z različnimi vrstami podatkov in popolnoma spremenite njeno vedenje.
Če želite uporabiti dekorator več odprem, sledite tem korakom:
- Namestite multipledispath v vašem okolju Python:
pip install multipledispatch
- Okrasite svoje funkcije z @odprema dekorater. The @odprema dekorater je a Python dekorater ki vam omogoča izvajanje večkratnega pošiljanja. Samodejno bo poslal ustrezno funkcijo na podlagi argumentov, ki ji jih posredujete. Lahko uporabite @odprema dekorater po tem vzorcu:
from multipledispatch import dispatch
@dispatch(data type1, data type2, data typeX)
defyour_function(a, b, c, x):
pass
# perform your operations here
Tukaj je primer, ki uporablja dekorator večkratne odpreme za preobremenitev funkcij v 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']))
Zgornji delček kode definira dva primerka dodaj() funkcijo. Prvi primer vzame dve celi števili kot argumenta in vrne njuno vsoto.
Medtem druga različica te funkcije vključuje celo število in seznam. Seznamu doda celo število in vrne nov seznam.
Ta pristop k preobremenitvi funkcij v Pythonu vam daje veliko prilagodljivosti, še posebej, če morate spremeniti vedenje svoje metode. Več lahko izveste iz večkratna odpremna dokumentacija.
Najboljši pristop k preobremenitvi funkcij v Pythonu
Pristop, ki ga boste uporabili pri preobremenitvi funkcij, bi moral biti odvisen od tega, kaj poskušate doseči. Če lahko svojo nalogo dokončate s privzetimi ali spremenljivimi argumenti, potem je dekorator za večkratno pošiljanje morda pretiran. Vendar pa je dekorator večkratne odpreme običajno najboljša možnost zaradi svoje učinkovitosti in natančnosti.
Ta dekorater ponuja čist in prilagodljiv način za implementacijo preobremenitve funkcij v Pythonu. Omogoča vam definiranje več izvedb ene same funkcije glede na vrsto njenih argumentov.
S tem pristopom lahko ustvarite prilagodljive funkcije, ki lahko sprejmejo različne vrste parametrov brez potrebe po zapletenih pogojnih stavkih.