Forståelse av funksjonsoverbelastning i Python
Funksjonsoverbelastning er et konsept som finnes i noen programmeringsspråk, hvor man kan definere flere versjoner av en enkelt funksjon. Hver av disse versjonene har samme navn, men unike funksjonssignaturer og ulike implementeringer.
Denne teknikken gir mulighet for å utføre forskjellige operasjoner basert på hvilken type og antall argumenter som sendes til funksjonen.
I motsetning til språk som C++ og Java, har ikke Python innebygd støtte for funksjonsoverbelastning. Men, det finnes likevel metoder for å etterligne denne funksjonaliteten.
Hvordan håndterer Python funksjonsoverbelastning?
I Python kan du definere en funksjon flere ganger med ulike parametere, datatyper eller en kombinasjon. Likevel vil Python kun anerkjenne den siste definisjonen av funksjonen når den kalles. Her er et eksempel:
def arithmetics(a, b):
return a - bdef arithmetics(a, b, c, d):
return a + b - c * dprint(arithmetics(1, 2, 3, 5))
print(arithmetics(1, 2))
Objektorienterte språk, som Java, støtter ofte overbelastning av funksjoner og metoder. En metode er i bunn og grunn en funksjon som er definert i en klasse.
I kodeeksemplet over, vil Python kun bruke den andre definisjonen av funksjonen `arithmetics()` når du prøver å kalle den. Forsøker du å kalle funksjonen med to argumenter, som i den første definisjonen, vil du få en feilmelding som angir at «posisjonsargumenter mangler».
Du vil ikke motta noen feil når du kaller funksjonen med fire argumenter. Dette demonstrerer at Python overskriver funksjonen med den siste instansen. Dette er ikke overbelastning slik det er definert i andre språk, så vi må finne løsninger.
Python støtter altså ikke funksjonsoverbelastning direkte, men det finnes noen triks som kan brukes for å simulere denne oppførselen i programmene dine.
Metode 1: Bruk av valgfrie parametere eller standardargumenter
Overbelastning kan etterlignes ved å definere en funksjon med standardargumenter. Her er et eksempel:
def arithmetics(a, b=0, c=0):
"""
Arguments:
a: Det første tallet.
b: Det andre tallet (valgfritt).
c: Det tredje tallet (valgfritt).
"""
return a - b + c
Denne funksjonen har tre parametere, men to av dem har standardverdier. Dette betyr at du kan kalle den med ett til tre argumenter:
print(arithmetics(1))
print(arithmetics(2, 5))
print(arithmetics(10, 3, 4))
Selv om denne tilnærmingen lar deg kalle funksjonen på flere måter, er den ikke særlig fleksibel. Her er noen av begrensningene:
- Du kan kun sende argumenter som er heltall eller flyttall.
- Det er ingen vesentlig endring i funksjonens oppførsel. Du kan for eksempel ikke endre oppførselen til å beregne arealet til en figur, eller skrive ut «Hei Verden».
Metode 2: Bruke variable argumenter
For å bruke variable argumenter for funksjonsoverbelastning i Python, bør du inkludere `*args`-parameteren når du definerer funksjonen. Med `*args`-parameteren kan du sende et variabelt antall posisjonsargumenter når du kaller funksjonen. Her er et eksempel:
def arithmetics(a, *args):
"""
Arguments:
a: Det første tallet.
*args: Et variabelt antall argumenter (valgfritt).
"""
args_sum = 0for num in args:
args_sum *= numreturn a - args_sum
print(arithmetics(1))
print(arithmetics(2, 5))
print(arithmetics(10, 3, 4, 2, 4, 6))
Funksjonen over tar to argumenter: et obligatorisk argument `a`, og `args` som lar deg legge inn så mange argumenter du ønsker.
Selv om den kan ta flere argumenter, kan funksjonen ovenfor kun utføre multiplikasjonsoperasjonen på de variable argumentene, som er representert ved hjelp av nøkkelordet `args`.
For å utføre flere operasjoner må du introdusere betingede setninger i koden, noe som kan gjøre den raskt kompleks.
Metode 3: Bruke Multiple Dispatch Decorator
Multiple dispatch-dekoratoren er et Python-bibliotek som gjør det mulig å definere flere implementeringer eller instanser av en funksjon basert på argumentenes type. Dette betyr at du kan definere den samme funksjonen med forskjellige datatyper og endre oppførselen.
Følg disse trinnene for å bruke multiple dispatch-dekoratoren:
pip install multipledispatch
from multipledispatch import dispatch@dispatch(data type1, data type2, data typeX)
def your_function(a, b, c, x):
pass
Her er et eksempel som bruker multiple dispatch-dekoratoren for funksjonsoverbelastning i Python:
from multipledispatch import dispatch@dispatch(int, int)
def add(a, b):
"""
Arguments:
a: Et hvilket som helst heltall.
b: Et hvilket som helst heltall.
"""
return a + b@dispatch(int, list)
def add(a, b):
"""
Arguments:
a: Et hvilket som helst heltall.
b: En hvilken som helst Python-liste.
"""
b.append(a)
return b
print(add(1, 2))
print(add(1, [2, 3, 4, 5, 'w', 'done']))
Kodebiten over definerer to instanser av funksjonen `add()`. Den første instansen tar to heltall som argumenter og returnerer summen av disse.
Den andre versjonen tar et heltall og en liste som argumenter. Den legger til heltallet i listen og returnerer den nye listen.
Denne tilnærmingen til funksjonsoverbelastning i Python gir stor fleksibilitet, spesielt om du trenger å endre oppførselen til en metode. Du kan lære mer i dokumentasjonen for multiple dispatch.
Den beste tilnærmingen til funksjonsoverbelastning i Python
Hvilken tilnærming du bør velge for å overbelaste en funksjon, avhenger av hva du ønsker å oppnå. Hvis du kan fullføre oppgaven ved å bruke standardargumenter eller variable argumenter, kan multiple dispatch-dekoratoren være unødvendig. Men, for effektivitet og nøyaktighet er multiple dispatch-dekoratoren som regel det beste alternativet.
Denne dekoratoren gir en ren og fleksibel metode for å implementere funksjonsoverbelastning i Python. Den lar deg definere flere implementeringer av en enkelt funksjon basert på argumentenes type.
Med denne tilnærmingen kan du lage fleksible funksjoner som kan akseptere ulike parametertyper uten behov for kompliserte betingede setninger.