Pythonで関数のオーバーロードを実装すると、60%の人は

文字列またはタプルのパラメータアドレスを持つ関数connectがあるとします。たとえば、次のとおりです。

connect('123.45.32.18:8080')
connect(('123.45.32.18', 8080))
复制代码

これらの2つの方法でコードを記述できるようにしたいので、次のようにコードを記述します。

def connect(address):
    if isinstance(address, str): ip, port = address.split(':') elif isinstance(address, tuple): ip, port = address else: print('地址格式不正确') 复制代码

この書き方は単純明快ですが、より多くのタイプのパラメーターがある場合は、非常に長く書く必要があります  if-elif-elif-...-elseコードは非常に見苦しく見えます。

Javaを学習したことのある学生は、関数のオーバーロードに慣れている必要があります。同じ名前で複数の関数を定義できますが、パラメーターのタイプまたは数値が異なるため、異なるコードロジックを実装できます。

Pythonでは、複数の関数を定義せずに、デフォルトパラメータを使用してさまざまなパラメータの数を解決できます。パラメータのタイプが異なる場合、異なるロジックを実装できます上記if-else加えて  functoolsモジュールのsingledispatchデコレータを使用し関数のオーバーロードを実装することもできます

コードを書きましょう:

from functools import singledispatch

@singledispatch
def connect(address): print(f' 传输参数类型为:{type(address)},不是有效类型') @connect.register def _(address: str): ip, port = address.split(':') print(f'参数为字符串,IP是:{ip}, 端口是:{port}') @connect.register def _(address: tuple): ip, port = address print(f'参数为元组,IP是:{ip}, 端口是:{port}') connect('123.45.32.18:8080') connect(('123.45.32.18', 8080)) connect(123) 复制代码
  1. このコードを実行して、さまざまなパラメーターに基づくさまざまな効果を見てみましょう。

 

 呼び出す関数は常に同じconnectであることがわかりますが、入力パラメーターのタイプが異なるため、その操作の結果も異なります。

singledispatch関数装飾するために使用し、この関数が呼び出す関数です。

受信パラメーターが異なる場合のこの関数の特定の実装は、以下に登録されている関数によって実現されます。@我们定义的函数名.register登録時に使用します。登録された関数の名前が何であるかは関係ないので、代わりにアンダースコアを使用します。

登録された関数の最初のパラメーターは、型注釈を通じて使用する型を決定します。定義した関数を呼び出すときに、パラメーターの型が登録済み関数に準拠している場合は、登録済み関数が実行されます。パラメータタイプが登録された関数のいずれも満たさない場合、元の関数が実行されます。

タイプアノテーションを使用してパラメータタイプを指定することは、Python 3.7以降に導入された新機能です。Python 3.6以前では@我们定义的函数名.register(类型)、たとえば次のようにタイプを指定する必要があります。

from functools import singledispatch

@singledispatch
def connect(address): print(f' 传输参数类型为:{type(address)},不是有效类型') @connect.register(str) def _(address): ip, port = address.split(':') print(f'参数为字符串,IP是:{ip}, 端口是:{port}') @connect.register(tuple) def _(address): ip, port = address print(f'参数为元组,IP是:{ip}, 端口是:{port}') 复制代码

同時に、最初のパラメーターの異なるタイプのみがオーバーロードされることに注意する別のポイントがあります。以下のパラメーターのタイプ変更は自動的に無視されます。

最後の注意: Pythonの採用でも趣味でも、覚えておいてください。プロジェクト開発の経験は常に中核です。2020年の高度な実用的なビデオチュートリアルの最新のPython入門ガイドがない場合は、エディターのPythonエクスチェンジにアクセスできます。 7または7と5(同音数)の変換の下で見つけることができます。多くの新しいPythonチュートリアルプロジェクトがあり、古いドライバーに相談してアドバイスを求めることもできます!
この記事のテキストと画像は、インターネットと独自のアイデアに基づいています。これらは、学習とコミュニケーションのみを目的としています。営利目的で使用することはありません。著作権は原作者に帰属します。ご不明な点がある場合は、処理に間に合うようにご連絡ください。

おすすめ

転載: www.cnblogs.com/chengxuyuanaa/p/12719855.html