Sobrecàrrega del mètode:
porció de matriu java
Dos o més mètodes tenen el mateix nom però diferents nombres de paràmetres o diferents tipus de paràmetres, o tots dos. Aquests mètodes s'anomenen mètodes sobrecarregats i això s'anomena mètode sobrecàrrega .
Com altres idiomes (per exemple, sobrecàrrega de mètodes en C++ ) fer, python no admet la sobrecàrrega de mètodes per defecte. Però hi ha diferents maneres d'aconseguir la sobrecàrrega de mètodes a Python.
El problema amb la sobrecàrrega de mètodes a Python és que podem sobrecarregar els mètodes, però només podem utilitzar l'últim mètode definit.
Python 3
# 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>)> |
>
>Sortida
100>
Al codi anterior, hem definit dos mètodes de producte que només podem utilitzar el segon mètode de producte, ja que Python no admet la sobrecàrrega de mètodes. Podem definir molts mètodes amb el mateix nom i arguments diferents, però només podem utilitzar l'últim mètode definit. Trucar l'altre mètode produirà un error. Com aquí trucant producte (4,5) produirà un error ja que l'últim mètode de producte definit pren tres arguments.
Així, per superar el problema anterior podem utilitzar diferents maneres d'aconseguir la sobrecàrrega del mètode.
Mètode 1 (no és el mètode més eficient):
Podem utilitzar els arguments per fer que la mateixa funció funcioni de manera diferent, és a dir, segons els arguments.
Python 3
# 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'>)> |
>
>Sortida
11 Hi Geeks>
Mètode 2 (no l'eficient):
Podem aconseguir una sobrecàrrega de mètodes a Python mitjançant la funció definida per l'usuari Cap paraula clau com a paràmetre predeterminat.
Explicació del codi:
El primer paràmetre del mètode d'afegir s'estableix a Cap. Això ens donarà l'opció de cridar-lo amb o sense paràmetre.
Quan passem arguments al mètode add (Funcionant):
- El mètode comprova si tots dos paràmetres estan disponibles o no.
- Com que ja hem donat els valors dels paràmetres predeterminats com a Cap, si no es passa algun dels valors, es mantindrà cap.
- Utilitzant les declaracions If-Else, podem aconseguir una sobrecàrrega de mètodes comprovant cada paràmetre com a declaració única.
Python 3
# 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>)> |
>
>Sortida
5 2>
El problema dels mètodes anteriors és que fa que el codi sigui més complex amb múltiples declaracions if/else i no és la manera desitjada d'aconseguir la sobrecàrrega del mètode.
Mètode 3 (eficient):
Mitjançant l'ús del decorador d'enviament múltiple
El decorador d'enviament múltiple es pot instal·lar per:
pip3 install multipledispatch>
Si pip no està instal·lat al vostre dispositiu:
Feu clic aquí per a Linux
Python 3
xd significat
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> |
>
>
Sortida:
6 12 17.985999999999997>
A Backend, Dispatcher crea un objecte que emmagatzema una implementació diferent i en temps d'execució, selecciona el mètode adequat segons el tipus i el nombre de paràmetres passats.