Overbelasting van functies is misschien niet ingebouwd in Python, maar er zijn manieren om dit na te bootsen.
Overbelasting van functies is een functie in sommige programmeertalen waarmee u variaties op dezelfde functie kunt definiëren. Elke variant heeft dezelfde naam, maar verschillende implementaties, met unieke functiehandtekeningen.
Met deze techniek kunt u verschillende bewerkingen uitvoeren op basis van het type en aantal argumenten dat aan een functie wordt doorgegeven.
In tegenstelling tot talen als C++ en Java ondersteunt Python standaard geen overbelasting van functies, maar er zijn manieren om vergelijkbare functionaliteit te bereiken.
Hoe gaat Python om met functieoverbelasting?
In Python kun je dezelfde functie meer dan eens definiëren met verschillende parameters, gegevenstypen of beide in elke definitie. Python herkent echter alleen de laatste definitie van de functie wanneer u deze aanroept. Hier is een voorbeeld:
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
Objectgeoriënteerde talen, zoals Java, ondersteunen vaak overbelasting van functies en methoden. Een methode is eenvoudigweg een functie die u binnen een klasse definieert.
In de bovenstaande code herkent Python alleen de tweede definitie van de rekenkunde() functie wanneer u het in uw project probeert aan te roepen. Als u de functie probeert aan te roepen met twee argumenten zoals eerst gedefinieerd, krijgt u een foutmelding met de melding "ontbrekende vereiste positionele argumenten".
U krijgt geen foutmelding als u de functie met vier argumenten aanroept. Dit betekent dat Python de functie heeft overschreven met de nieuwste instantie. Dit is niet het gedrag van overbelasting, dus u moet dit aanpakken.
Python verwerkt dus standaard niet de overbelasting van functies, maar er zijn enkele trucs die u kunt gebruiken om het gedrag ervan in uw programma's te simuleren.
Methode 1: Optionele parameters of standaardargumenten gebruiken
U kunt overbelasting bereiken door een functie met standaardargumenten te definiëren. Hier is een voorbeeld:
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
Deze functie heeft drie parameters, maar twee daarvan hebben standaardwaarden. Dit betekent dat je het met één tot drie argumenten kunt aanroepen:
print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11
Hoewel je met deze aanpak de functie op verschillende manieren kunt aanroepen, is deze op de lange termijn niet erg effectief. Hier zijn enkele van de beperkingen:
- U kunt alleen argumenten doorgeven die gehele getallen of floats zijn.
- Er is geen significante verandering in het gedrag van de functie. U kunt het gedrag ervan bijvoorbeeld niet wijzigen om de oppervlakte van een vorm of zelfs een afdruk te berekenen Hallo Wereld.
Methode 2: Variabele argumenten gebruiken
Om variabele argumenten te gebruiken voor functieoverbelasting in Python, zou je dat moeten doen neem de parameter args op bij het definiëren van uw functie. De arg Met parameter kunt u meerdere positionele argumenten doorgeven bij het aanroepen van uw functie. Hier is een voorbeeld:
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
De bovenstaande functie heeft twee argumenten nodig: een verplicht argument genaamd A en de arg argument, waarmee u zoveel argumenten kunt invoeren als u nodig heeft.
Hoewel er meerdere argumenten nodig zijn, kan de bovenstaande functie de vermenigvuldigingsbewerking alleen uitvoeren op de variabele argumenten, d.w.z. de argumenten die worden weergegeven door de arg trefwoord.
Als u meerdere bewerkingen wilt uitvoeren, moet u dit doen introduceer voorwaardelijke instructies in uw code, en dit kan snel ingewikkeld worden.
Methode 3: De Multiple Dispatch Decorator gebruiken
De Multiple Dispatch Decorator is een Python-bibliotheek waarmee u meerdere implementaties of exemplaren van een enkele functie kunt definiëren, op basis van het type argumenten. Dit betekent dat u dezelfde functie met verschillende gegevenstypen kunt definiëren en het gedrag ervan volledig kunt wijzigen.
Om de meervoudige verzenddecorateur te gebruiken, volgt u deze stappen:
- Installeren meervoudig dispad in uw Python-omgeving:
pip install multipledispatch
- Versier jouw functie(s) met de @verzenden decorateur. De @verzenden decorateur is een Python-decorateur waarmee u meerdere verzendingen kunt implementeren. Het verzendt automatisch de juiste functie op basis van de argumenten die u eraan doorgeeft. U kunt gebruik maken van de @verzenden decorateur door dit patroon te volgen:
from multipledispatch import dispatch
@dispatch(data type1, data type2, data typeX)
defyour_function(a, b, c, x):
pass
# perform your operations here
Hier is een voorbeeld waarin de multiple dispatch-decorateur wordt gebruikt voor overbelasting van functies in 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']))
Het bovenstaande codefragment definieert twee exemplaren van de toevoegen() functie. De eerste instantie neemt twee gehele getallen als argumenten en retourneert hun som.
Ondertussen bevat de tweede versie van deze functie een geheel getal en een lijst. Het voegt het gehele getal aan de lijst toe en retourneert de nieuwe lijst.
Deze benadering van functieoverbelasting in Python geeft je veel flexibiliteit, vooral als je het gedrag van je methode moet veranderen. Je kunt meer leren van de meerdere verzenddocumentatie.
De beste aanpak voor functieoverbelasting in Python
De aanpak die u kiest om overbelasting van functies aan te pakken, moet afhangen van wat u probeert te bereiken. Als u uw taak kunt voltooien met behulp van standaard- of variabele argumenten, is de decorateur voor meerdere verzendingen misschien overdreven. De decorateur met meerdere verzendingen is echter meestal de beste optie vanwege zijn efficiëntie en nauwkeurigheid.
Deze decorateur biedt een schone en flexibele manier om functieoverbelasting in Python te implementeren. Hiermee kunt u meerdere implementaties van een enkele functie definiëren op basis van het type argumenten.
Met deze aanpak kunt u flexibele functies maken die verschillende parametertypen kunnen accepteren zonder dat er complexe voorwaardelijke instructies nodig zijn.