文字列またはタプルのパラメータアドレスを持つ関数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) 复制代码
- このコードを実行して、さまざまなパラメーターに基づくさまざまな効果を見てみましょう。
呼び出す関数は常に同じ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チュートリアルプロジェクトがあり、古いドライバーに相談してアドバイスを求めることもできます!
この記事のテキストと画像は、インターネットと独自のアイデアに基づいています。これらは、学習とコミュニケーションのみを目的としています。営利目的で使用することはありません。著作権は原作者に帰属します。ご不明な点がある場合は、処理に間に合うようにご連絡ください。