Przeciążanie metody:
liczba całkowita podwójna Java
Dwie lub więcej metod ma tę samą nazwę, ale różną liczbę parametrów lub różne typy parametrów, lub jedno i drugie. Metody te nazywane są metodami przeciążonymi, a to nazywa się metodą przeciążanie .
Podobnie jak inne języki (np. Przeciążanie metod w C++ ) zrobić, Python domyślnie nie obsługuje przeciążania metod. Istnieją jednak różne sposoby osiągnięcia przeciążania metod w Pythonie.
Problem z przeciążaniem metod w Pythonie polega na tym, że możemy przeciążać metody, ale możemy używać tylko ostatnio zdefiniowanej metody.
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>)> |
>
>Wyjście
100>
W powyższym kodzie zdefiniowaliśmy dwie metody produktu, możemy użyć tylko drugiej metody produktu, ponieważ Python nie obsługuje przeciążania metod. Możemy zdefiniować wiele metod o tej samej nazwie i różnych argumentach, ale możemy używać tylko ostatnio zdefiniowanej metody. Wywołanie drugiej metody spowoduje błąd. Jak tutaj, dzwoniąc produkt(4,5) spowoduje błąd, ponieważ ostatnia zdefiniowana metoda produktu przyjmuje trzy argumenty.
Zatem, aby przezwyciężyć powyższy problem, możemy zastosować różne sposoby osiągnięcia przeciążenia metody.
Metoda 1 (nie jest to najbardziej efektywna metoda):
Możemy użyć argumentów, aby ta sama funkcja działała inaczej, tj. Zgodnie z argumentami.
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'>)> |
>
>Wyjście
11 Hi Geeks>
Metoda 2 (nie ta skuteczna):
Możemy osiągnąć przeciążanie metod w Pythonie za pomocą funkcji zdefiniowanej przez użytkownika Nic słowo kluczowe jako parametr domyślny.
Wyjaśnienie kodu:
Pierwszy parametr metody add jest ustawiony na None. To da nam możliwość wywołania go z parametrem lub bez.
Kiedy przekazujemy argumenty do metody add (Praca):
- Metoda sprawdza, czy oba parametry są dostępne, czy nie.
- Ponieważ już nadaliśmy domyślne wartości parametrów jako None, jeśli którakolwiek wartość nie zostanie przekazana, pozostanie None.
- Używając instrukcji If-Else, możemy osiągnąć przeciążenie metody, sprawdzając każdy parametr jako pojedynczą instrukcję.
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>)> |
JavaScript
>
>Wyjście
5 2>
Problem z powyższymi metodami polega na tym, że komplikują kod z wieloma instrukcjami if/else i nie są pożądanym sposobem na osiągnięcie przeciążenia metody.
Metoda 3 (skuteczna):
Za pomocą dekoratora wielu wysyłek
Dekorator wielu wysyłek Może być zainstalowany przez:
pip3 install multipledispatch>
Jeśli pip nie jest zainstalowany na Twoim urządzeniu:
Kliknij tutaj, aby zapoznać się z systemem Windows
Kliknij tutaj, aby zapoznać się z systemem 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> |
>
>
Wyjście:
6 12 17.985999999999997>
W Backend Dispatcher tworzy obiekt przechowujący różne implementacje i w czasie wykonywania wybiera odpowiednią metodę ze względu na rodzaj i liczbę przekazanych parametrów.