Preťažovanie funkcií nemusí byť zabudované do Pythonu, ale existujú spôsoby, ako ho napodobniť.

Preťaženie funkcií je funkcia v niektorých programovacích jazykoch, ktorá vám umožňuje definovať variácie tej istej funkcie. Každý variant má rovnaký názov, ale rôzne implementácie s jedinečnými podpismi funkcií.

Táto technika vám umožňuje vykonávať rôzne operácie na základe typu a počtu argumentov odovzdaných funkcii.

Na rozdiel od jazykov ako C++ a Java Python štandardne nepodporuje preťaženie funkcií, existujú však spôsoby, ako dosiahnuť podobnú funkčnosť.

Ako Python zvláda preťaženie funkcií?

V Pythone môžete tú istú funkciu definovať viackrát s rôznymi parametrami, typmi údajov alebo oboma v každej definícii. Python však rozpozná iba poslednú definíciu funkcie, keď ju zavoláte. Tu je príklad:

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

Objektovo orientované jazyky, ako je Java, často podporujú preťaženie funkcií a metód. Metóda je jednoducho funkcia, ktorú definujete vo vnútri triedy.

instagram viewer

Vo vyššie uvedenom kóde Python rozpozná iba druhú definíciu aritmetika() keď sa ju pokúsite zavolať vo svojom projekte. Ak sa pokúsite zavolať funkciu s dvoma argumentmi, ako sú definované ako prvé, dostanete chybu, ktorá hovorí: „chýbajúce požadované pozičné argumenty“.

Pri volaní funkcie so štyrmi argumentmi nedostanete chybu. To znamená, že Python prepísal funkciu jej najnovšou inštanciou. Toto nie je správanie preťaženia, takže to musíte riešiť.

Python teda štandardne nerieši preťaženie funkcií, ale existuje niekoľko trikov, ktoré môžete použiť na simuláciu jeho správania vo vašich programoch.

Metóda 1: Použitie voliteľných parametrov alebo predvolených argumentov

Preťaženie môžete dosiahnuť definovaním funkcie s predvolenými argumentmi. Tu je príklad:

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

Táto funkcia má tri parametre, ale dva z nich majú predvolené hodnoty. To znamená, že ho môžete volať s jedným až tromi argumentmi:

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

Hoci tento prístup umožňuje volať funkciu niekoľkými rôznymi spôsobmi, z dlhodobého hľadiska nie je veľmi efektívny. Tu sú niektoré z jeho obmedzení:

  • Môžete odovzdať iba argumenty, ktoré sú buď celé čísla alebo plávajúce čísla.
  • V správaní funkcie nedochádza k výraznej zmene. Napríklad nemôžete zmeniť jeho správanie, aby ste vypočítali plochu tvaru alebo dokonca vytlačili Ahoj svet.

Metóda 2: Použitie variabilných argumentov

Ak chcete použiť variabilné argumenty na preťaženie funkcií v Pythone, mali by ste pri definovaní funkcie zahrňte parameter args. The args parameter vám umožňuje odovzdať viacero pozičných argumentov pri volaní vašej funkcie. Tu je príklad:

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

Vyššie uvedená funkcia má dva argumenty: tzv. povinný argument a a args argument, ktorý vám umožňuje zadať toľko argumentov, koľko potrebujete.

Aj keď môže mať viacero argumentov, vyššie uvedená funkcia môže vykonať operáciu násobenia iba na premenných argumentoch, t. j. argumentoch reprezentovaných args kľúčové slovo.

Ak chcete vykonať viacero operácií, musíte zaveďte do svojho kódu podmienené príkazya to sa môže rýchlo skomplikovať.

Metóda 3: Použitie dekorátora viacerých expedícií

Dekorátor viacerých odoslaní je knižnica Pythonu, ktorá vám umožňuje definovať viacero implementácií alebo inštancií jednej funkcie na základe typu jej argumentov. To znamená, že môžete definovať rovnakú funkciu s rôznymi typmi údajov a úplne zmeniť jej správanie.

Ak chcete použiť dekoratér s viacerými zásielkami, postupujte takto:

  1. Inštalácia viacnásobná dispatia vo vašom prostredí Pythonu:
    pip install multipledispatch
  2. Ozdobte svoju funkciu (funkcie) pomocou @odoslanie dekoratér. The @odoslanie dekoratér je a Dekoratér Python čo vám umožňuje implementovať viacnásobné odoslanie. Automaticky odošle príslušnú funkciu na základe argumentov, ktoré jej odovzdáte. Môžete použiť @odoslanie dekoratér podľa tohto vzoru:
    from multipledispatch import dispatch

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

Tu je príklad, ktorý používa dekorátor viacerých odoslaní na preťaženie funkcií v Pythone:

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

Útržok kódu uvedený vyššie definuje dve inštancie pridať () funkciu. Prvá inštancia vezme dve celé čísla ako svoje argumenty a vráti ich súčet.

Medzitým druhá verzia tejto funkcie obsahuje celé číslo a zoznam. Pripojí celé číslo k zoznamu a vráti nový zoznam.

Tento prístup k preťaženiu funkcií v Pythone vám poskytuje veľkú flexibilitu, najmä ak potrebujete zmeniť správanie vašej metódy. Viac sa môžete dozvedieť z viacnásobná expedičná dokumentácia.

Najlepší prístup k preťaženiu funkcií v Pythone

Prístup k preťaženiu funkcií by mal závisieť od toho, čo sa snažíte dosiahnuť. Ak môžete svoju úlohu dokončiť pomocou predvolených alebo variabilných argumentov, dekorátor viacerých odoslaní môže byť prehnaný. Avšak, viacnásobný expedičný dekoratér je zvyčajne najlepšou voľbou pre svoju účinnosť a presnosť.

Tento dekorátor poskytuje čistý a flexibilný spôsob implementácie preťaženia funkcií v Pythone. Umožňuje vám definovať viacero implementácií jednej funkcie na základe typu jej argumentov.

Pomocou tohto prístupu môžete vytvárať flexibilné funkcie, ktoré môžu akceptovať rôzne typy parametrov bez potreby zložitých podmienených príkazov.