ホームページ >バックエンド開発 >Python チュートリアル >Python はメソッドのオーバーロードのような動作をどのように実現するのでしょうか?
Python では、メソッドのオーバーロードの概念は、C などの言語とは異なり、直接サポートされていません。ただし、実行時の引数の型に基づいて関数をディスパッチできる「マルチ ディスパッチ」と呼ばれる同様の手法があります。
の multipledispatch パッケージPython は、複数のディスパッチ機能を実装する方法を提供します。これにより、関数を特定の引数の型で登録し、実行時に動的に選択できるようになります。
multidispatch パッケージを使用すると、異なる引数を指定して、同じ名前の複数の関数を定義できます。タイプの組み合わせ:
from multipledispatch import dispatch from collections import namedtuple from types import LambdaType Sprite = namedtuple('Sprite', ['name']) Point = namedtuple('Point', ['x', 'y']) Curve = namedtuple('Curve', ['x', 'y', 'z']) Vector = namedtuple('Vector', ['x','y','z']) @dispatch(Sprite, Point, Vector, int) def add_bullet(sprite, start, direction, speed): print("Called Version 1") @dispatch(Sprite, Point, Point, int, float) def add_bullet(sprite, start, headto, speed, acceleration): print("Called version 2") @dispatch(Sprite, LambdaType) def add_bullet(sprite, script): print("Called version 3") @dispatch(Sprite, Curve, int) def add_bullet(sprite, curve, speed): print("Called version 4")
登録された関数を使用するには、目的の関数を呼び出すだけです。適切な引数の型を持つ関数:
sprite = Sprite('Turtle') start = Point(1,2) direction = Vector(1,1,1) speed = 100 #km/h acceleration = 5.0 #m/s**2 script = lambda sprite: sprite.x * 2 curve = Curve(3, 1, 4) headto = Point(100, 100) # somewhere far away add_bullet(sprite, start, direction, speed) add_bullet(sprite, start, headto, speed, acceleration) add_bullet(sprite, script) add_bullet(sprite, curve, speed)
このアプローチにより、Python でのオーバーロードの欠点を回避しながら、さまざまな引数の組み合わせを持つ関数を柔軟に作成できます。
以上がPython はメソッドのオーバーロードのような動作をどのように実現するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。