63

関数のオーバーロードが言うように:

関数のオーバーロードは Python にはありません。

これはオブジェクト指向 (OO) 言語でもあるため、私が感じる限り、これは大きなハンディキャップです。最初は、引数の型を区別できないことが難しいことに気付きましたが、Python の動的な性質により簡単になりました (たとえば、リスト、タプル、文字列は非常に似ています)。

ただし、渡された引数の数を数えてからジョブを実行するのはやり過ぎです。

4

5 に答える 5

36

さて、Python構文を使用してC ++コードを書き込もうとしているのでない限り、何のためにオーバーロードする必要がありますか?

正反対だと思います。オーバーロードは、強く型付けされた言語をPythonのように動作させるためにのみ必要です。Pythonでは、キーワード引数があり、とが*argsあり**kwargsます。

例を参照してください:Pythonで複数のコンストラクターを持つクリーンでPythonicな方法は何ですか?

于 2009-04-09T09:36:49.093 に答える
33

unwindが指摘したように、デフォルト値を持つキーワード引数は大いに役立つ可能性があります。

また、私の意見では、どの型がメソッドに渡されるかについて多くのことを心配することはPythonの精神に反していると述べます。Pythonでは、ダックタイピングを使用する方が受け入れられていると思います。オブジェクトが何であるかではなく、オブジェクトが何を実行できるかを尋ねます。

したがって、メソッドが文字列またはタプルを受け入れる可能性がある場合は、次のようにすることができます。

def print_names(names):
    """Takes a space-delimited string or an iterable"""
    try:
        for name in names.split(): # string case
            print name
    except AttributeError:
        for name in names:
            print name

次に、次のいずれかを実行できます。

print_names("Ryan Billy")
print_names(("Ryan", "Billy"))

そのようなAPIは時々設計上の問題を示しますが。

于 2009-04-09T09:48:07.273 に答える
6

変更可能なコンテナー データ型を関数に渡すことができ、必要なものを何でも含めることができます。

別の機能が必要な場合は、関数に別の名前を付けるか、同じインターフェイスが必要な場合は、受信したデータに基づいて関数を適切に呼び出すインターフェイス関数 (またはメソッド) を記述します。

これが Java から来ていることに慣れるのにしばらく時間がかかりましたが、実際には「大きなハンディキャップ」ではありません。

于 2009-04-09T08:53:55.233 に答える