logo

Python | Metod Överbelastning

Metodöverbelastning:

sträng understräng

Två eller flera metoder har samma namn men olika antal parametrar eller olika typer av parametrar, eller båda. Dessa metoder kallas överbelastade metoder och detta kallas metod överbelastning .

Liksom andra språk (t.ex. metodöverbelastning i C++ ) gör, python stöder inte metodöverbelastning som standard. Men det finns olika sätt att uppnå metodöverbelastning i Python.



Problemet med metodöverbelastning i Python är att vi kan överbelasta metoderna men kan bara använda den senast definierade metoden.

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

>

>

Produktion

100>

I ovanstående kod har vi definierat två produktmetoder vi kan bara använda den andra produktmetoden, eftersom python inte stöder metodöverbelastning. Vi kan definiera många metoder med samma namn och olika argument, men vi kan bara använda den senast definierade metoden. Att anropa den andra metoden ger ett fel. Som att ringa här produkt(4,5) kommer att ge ett fel eftersom den senast definierade produktmetoden tar tre argument.

För att övervinna ovanstående problem kan vi alltså använda olika sätt för att uppnå metoden överbelastning.

Metod 1 (inte den mest effektiva metoden):

Vi kan använda argumenten för att få samma funktion att fungera annorlunda, dvs enligt argumenten.

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

>

>

Produktion

11 Hi Geeks>

Metod 2 (inte den effektiva):

Vi kan uppnå metodöverbelastning i python genom användardefinierad funktion med hjälp av Ingen nyckelord som standardparameter.

Kodförklaring:

Den första parametern för add-metoden är inställd på Ingen. Detta ger oss möjlighet att anropa den med eller utan en parameter.

När vi skickar argument till add-metoden (fungerar):

  • Metoden kontrollerar om båda parametrarna är tillgängliga eller inte.
  • Eftersom vi redan har angett standardparametervärden som None, förblir det None om något av värdet inte godkänns.
  • Med hjälp av If-Else-satser kan vi uppnå metodöverbelastning genom att kontrollera varje parameter som en enda sats.

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

>

>

Produktion

5 2>

Problemet med ovanstående metoder är att det gör koden mer komplex med flera if/else-sats och är inte det önskade sättet att uppnå metodöverbelastningen.

Metod 3 (effektiv):

Genom att använda Multiple Dispatch Decorator

Multiple Dispatch Decorator Kan installeras av:

pip3 install multipledispatch>

Om pip inte är installerat på din enhet:

Klicka här för Windows

Klicka här för 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>

>

>

Produktion:

6 12 17.985999999999997>

I Backend skapar Dispatcher ett objekt som lagrar olika implementeringar och vid körning väljer den lämplig metod som typ och antal parametrar som skickas.

sqrt java matematik