メソッドのオーバーロード:
データリンク層プロトコル
2 つ以上のメソッドの名前は同じですが、パラメータの数またはパラメータの種類、あるいはその両方が異なります。これらのメソッドはオーバーロードされたメソッドと呼ばれ、これはメソッドと呼ばれます 過負荷 。
他の言語と同様に (たとえば、 C++ でのメソッドのオーバーロード ) を実行しますが、Python はデフォルトではメソッドのオーバーロードをサポートしません。ただし、Python でメソッドのオーバーロードを実現するにはさまざまな方法があります。
Python でのメソッドのオーバーロードの問題は、メソッドをオーバーロードする可能性があるにもかかわらず、最新に定義されたメソッドしか使用できないことです。
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>)> |
>
>出力
100>
上記のコードでは 2 つの積メソッドを定義しましたが、Python はメソッドのオーバーロードをサポートしていないため、2 番目の積メソッドのみを使用できます。同じ名前で異なる引数のメソッドを多数定義できますが、使用できるのは最後に定義されたメソッドのみです。他のメソッドを呼び出すとエラーが発生します。ここに電話しているように 製品(4,5) 最新に定義されたプロダクト メソッドは 3 つの引数を取るため、エラーが発生します。
したがって、上記の問題を解決するには、さまざまな方法を使用してメソッドのオーバーロードを実現できます。
方法 1 (最も効率的な方法ではありません):
引数を使用すると、同じ関数を異なる動作、つまり引数に従って動作させることができます。
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'>)> |
>
>出力
11 Hi Geeks>
方法 2 (効率的ではありません):
Pythonでメソッドのオーバーロードを実現するには、ユーザー定義関数を使用します。 なし キーワードをデフォルトパラメータとして使用します。
コードの説明:
add メソッドの最初のパラメータは None に設定されます。これにより、パラメーターを指定して呼び出すかどうかを選択できます。
add メソッドに引数を渡すと (作業中):
- このメソッドは、両方のパラメータが使用可能かどうかを確認します。
- すでにデフォルトのパラメータ値を None として指定しているため、値が渡されない場合は None のままになります。
- If-Else ステートメントを使用すると、各パラメーターを単一のステートメントとしてチェックすることでメソッドのオーバーロードを実現できます。
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>)> |
>
>出力
5 2>
上記のメソッドの問題は、複数の if/else ステートメントによりコードがより複雑になり、メソッドのオーバーロードを実現する望ましい方法ではないことです。
方法 3 (効率的な方法):
複数のディスパッチ デコレータを使用する
Multiple Dispatch Decorator は次の方法でインストールできます。
pip3 install multipledispatch>
pip がデバイスにインストールされていない場合:
jvm
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> |
>
>
出力:
6 12 17.985999999999997>
バックエンドでは、Dispatcher はさまざまな実装を格納するオブジェクトを作成し、実行時に渡されるパラメーターのタイプと数として適切なメソッドを選択します。