ホームページ >バックエンド開発 >Python チュートリアル >Python でメソッドのオーバーロードが機能しない場合は?
Python でのメソッドのオーバーロード
Python におけるメソッドのオーバーロードとは、名前は同じだがパラメーターが異なる複数のメソッドを定義する機能です。ただし、これにより予期しない動作が発生する可能性があります。
例 1:
<code class="python">class A: def stackoverflow(self): print ('first method') def stackoverflow(self, i): print ('second method', i)</code>
引数を指定してメソッドを呼び出すと、2 番目のメソッドが呼び出されます。
<code class="python">ob=A() ob.stackoverflow(2) # Output: second method 2</code>
しかし、引数なしでそれを呼び出すと、Python はエラーを発生させます:
<code class="python">ob=A() ob.stackoverflow() # Output: TypeError: stackoverflow() takes exactly 2 arguments (1 given)</code>
これは、Python が最初のメソッドには引数がなく、デフォルトの引数が 1 つもないとみなされるためです。 .
解決策:
この問題を解決するには、デフォルトのパラメータ値を使用できます:
<code class="python">class A: def stackoverflow(self, i='some_default_value'): print('only method')</code>
これで、両方の呼び出しが機能するようになります:
<code class="python">ob=A() ob.stackoverflow(2) # Output: only method ob.stackoverflow() # Output: only method</code>
単一ディスパッチによる高度なオーバーロード
Python 3.4 では、単一ディスパッチの汎用関数が導入されました。これにより、さまざまな引数の型に対して特定の動作を定義できるようになります。
<code class="python">from functools import singledispatch @singledispatch def fun(arg, verbose=False): if verbose: print("Let me just say,", end=" ") print(arg) @fun.register(int) def _(arg, verbose=False): if verbose: print("Strength in numbers, eh?", end=" ") print(arg) @fun.register(list) def _(arg, verbose=False): if verbose: print("Enumerate this:") for i, elem in enumerate(arg): print(i, elem)</code>
これにより、さまざまな引数タイプで fun を呼び出し、適切な動作を取得できるようになります:
<code class="python">fun(42) # Output: Strength in numbers, eh? 42 fun([1, 2, 3]) # Output: Enumerate this: # 0 1 # 1 2 # 2 3</code>
以上がPython でメソッドのオーバーロードが機能しない場合は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。