Python | Přetížení metody

Přetížení metody:

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.

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ů.