Python | Metodas Perkrovimas
Metodo perkrovimas:
Du ar daugiau metodų turi tą patį pavadinimą, bet skirtingą parametrų skaičių arba skirtingų tipų parametrus, arba abu. Šie metodai vadinami perkrautais metodais, o tai vadinama metodu perkrovimas .
Kaip ir kitomis kalbomis (pvz. metodo perkrovimas C++ ), pagal numatytuosius nustatymus python nepalaiko metodo perkrovimo. Tačiau yra įvairių būdų, kaip pasiekti metodų perkrovą Python.
„Python“ metodo perkrovimo problema yra ta, kad galime perkrauti metodus, bet galime naudoti tik naujausią apibrėžtą metodą.
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> )> |
Išvestis
100
Aukščiau pateiktame kode apibrėžėme du produkto metodus, kuriuos galime naudoti tik antrąjį produkto metodą, nes python nepalaiko metodo perkrovimo. Galime apibrėžti daug to paties pavadinimo ir skirtingų argumentų metodų, tačiau galime naudoti tik naujausią apibrėžtą metodą. Iškvietus kitą metodą, bus padaryta klaida. Kaip čia skambina produktas(4,5) sukels klaidą, nes naujausias produkto metodas turi tris argumentus.
Taigi, norėdami įveikti aukščiau pateiktą problemą, galime naudoti įvairius metodo perkrovimo būdus.
1 metodas (ne pats veiksmingiausias):
Argumentus galime naudoti, kad ta pati funkcija veiktų kitaip, t. y. kaip argumentai.
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'> )> |
Išvestis
11 Hi Geeks
2 metodas (ne efektyvus):
Mes galime pasiekti metodo perkrovą python naudodami vartotojo apibrėžtą funkciją Nė vienas raktinis žodis kaip numatytasis parametras.
Kodo paaiškinimas:
Pirmasis pridėjimo metodo parametras nustatytas kaip Nėra. Tai suteiks mums galimybę skambinti su parametru arba be jo.
Kai perduodame argumentus pridėjimo metodui (veikia):
- Metodas patikrina, ar abu parametrai yra prieinami, ar ne.
- Kadangi mes jau suteikėme numatytąsias parametrų reikšmes kaip Nėra, jei kuri nors reikšmė nebus perduota, ji liks Nėra.
- Naudodami If-Else teiginius, galime pasiekti metodo perkrovą, patikrindami kiekvieną parametrą kaip vieną sakinį.
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> )> |
Išvestis
5 2
Aukščiau pateiktų metodų problema yra ta, kad tai daro kodą sudėtingesnį naudojant kelis if/else teiginius ir nėra pageidaujamas būdas pasiekti metodo perkrovą.
3 metodas (veiksmingas):
Naudojant kelių siuntimo dekoratorių
Kelių siuntimo dekoratorių galima montuoti:
pip3 install multipledispatch
Jei jūsų įrenginyje neįdiegtas pip:
Spustelėkite čia, jei norite naudoti „Windows“.
Spustelėkite čia norėdami gauti 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> |
Išvestis:
6 12 17.985999999999997
„Backend“ sistemoje „Dispatcher“ sukuria objektą, kuriame saugomas skirtingas diegimas, o vykdymo metu pasirenka tinkamą metodą, kaip perduodamų parametrų tipą ir skaičių.