logo

Python | Přetížení metody

Přetížení metody:

výhody a nevýhody technologie

Dvě nebo více metod mají stejný název, ale různé počty parametrů nebo různé typy parametrů, případně obojí. Tyto metody se nazývají přetížené metody a toto se nazývá metoda přetěžování .



Stejně jako jiné jazyky (např. přetížení metody v C++ ) do, python ve výchozím nastavení nepodporuje přetížení metod. Existují však různé způsoby, jak dosáhnout přetížení metod v Pythonu.

Problém s přetěžováním metod v Pythonu je ten, že můžeme přetížit metody, ale můžeme použít pouze nejnovější definovanou metodu.

Python3








# First product method.> # Takes two argument and print their> # product> def> product(a, b):> >p>=> a>*> b> >print>(p)> # Second product method> # Takes three argument and print their> # product> def> product(a, b, c):> >p>=> a>*> b>*>c> >print>(p)> # Uncommenting the below line shows an error> # product(4, 5)> # This line will call the second product method> product(>4>,>5>,>5>)>

>

>

Výstup

100>

Ve výše uvedeném kódu jsme definovali dvě metody produktu, můžeme použít pouze druhou metodu produktu, protože python nepodporuje přetížení metody. Můžeme definovat mnoho metod stejného jména a různých argumentů, ale můžeme použít pouze poslední definovanou metodu. Volání druhé metody způsobí chybu. Jako tady volání produkt (4,5) způsobí chybu, protože metoda posledního definovaného produktu vyžaduje tři argumenty.

K překonání výše uvedeného problému tedy můžeme použít různé způsoby, jak dosáhnout přetížení metody.

Metoda 1 (není nejúčinnější metoda):

Argumenty můžeme použít k tomu, aby stejná funkce fungovala odlišně, tj. podle argumentů.

Python3




# Function to take multiple arguments> def> add(datatype,>*>args):> ># if datatype is int> ># initialize answer as 0> >if> datatype>=>=> 'int'>:> >answer>=> 0> ># if datatype is str> ># initialize answer as ''> >if> datatype>=>=> 'str'>:> >answer>=> ''> ># Traverse through the arguments> >for> x>in> args:> ># This will do addition if the> ># arguments are int. Or concatenation> ># if the arguments are str> >answer>=> answer>+> x> >print>(answer)> # Integer> add(>'int'>,>5>,>6>)> # String> add(>'str'>,>'Hi '>,>'Geeks'>)>

>

>

Výstup

11 Hi Geeks>

Metoda 2 (není účinná):

Přetížení metody v pythonu můžeme dosáhnout pomocí uživatelsky definované funkce Žádný klíčové slovo jako výchozí parametr.

Vysvětlení kódu:

První parametr metody add je nastaven na None. To nám dá možnost volat jej s parametrem nebo bez něj.

Když předáme argumenty metodě add (Working):

  • Metoda zkontroluje, zda jsou oba parametry dostupné nebo ne.
  • Protože jsme již zadali výchozí hodnoty parametrů jako None, pokud některá z hodnot není předána, zůstane Žádná.
  • Pomocí příkazů If-Else můžeme dosáhnout přetížení metody kontrolou každého parametru jako jednoho příkazu.

Python3




# code> def> add(a>=>None>, b>=>None>):> ># Checks if both parameters are available> ># if statement will be executed if only one parameter is available> >if> a !>=> None> and> b>=>=> None>:> >print>(a)> ># else will be executed if both are available and returns addition of two> >else>:> >print>(a>+>b)> # two arguments are passed, returns addition of two> add(>2>,>3>)> # only one argument is passed, returns a> add(>2>)>

>

>

Výstup

5 2>

Problém s výše uvedenými metodami je v tom, že kód je složitější s více příkazy if/else a není to požadovaný způsob, jak dosáhnout přetížení metody.

kolik týdnů v měsíci

Metoda 3 (účinná jedna):

Použitím dekoratérů pro více odeslání

Vícenásobný expediční dekoratér lze nainstalovat pomocí:

pip3 install multipledispatch>

Pokud pip není na vašem zařízení nainstalován:

Klikněte zde pro Windows

Klikněte zde pro Linux

Python3




from> multipledispatch>import> dispatch> # passing one parameter> @dispatch>(>int>,>int>)> def> product(first, second):> >result>=> first>*>second> >print>(result)> # passing two parameters> @dispatch>(>int>,>int>,>int>)> def> product(first, second, third):> >result>=> first>*> second>*> third> >print>(result)> # you can also pass data type of any value as per requirement> @dispatch>(>float>,>float>,>float>)> def> product(first, second, third):> >result>=> first>*> second>*> third> >print>(result)> # calling product method with 2 arguments> product(>2>,>3>)># this will give output of 6> # calling product method with 3 arguments but all int> product(>2>,>3>,>2>)># this will give output of 12> # calling product method with 3 arguments but all float> product(>2.2>,>3.4>,>2.3>)># this will give output of 17.985999999999997>

>

>

Výstup:

6 12 17.985999999999997>

V Backendu Dispatcher vytvoří objekt, který ukládá různé implementace a za běhu vybere vhodnou metodu jako typ a počet předávaných parametrů.