Python でメソッドのオーバーロードが機能しない場合は?

Patricia Arquette
リリース: 2024-10-23 00:01:03
オリジナル
471 人が閲覧しました

When Method Overloading Doesn't Work in 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(&quot;Let me just say,&quot;, end=&quot; &quot;)
    print(arg)

@fun.register(int)
def _(arg, verbose=False):
    if verbose:
        print(&quot;Strength in numbers, eh?&quot;, end=&quot; &quot;)
    print(arg)

@fun.register(list)
def _(arg, verbose=False):
    if verbose:
        print(&quot;Enumerate this:&quot;)
    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 サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!