Python はメソッドのオーバーロードのような動作をどのように実現するのでしょうか?

Linda Hamilton
リリース: 2024-11-21 13:36:20
オリジナル
645 人が閲覧しました

How Does Python Achieve Method Overloading-like Behavior?

Python でのメソッドのオーバーロード

Python では、メソッドのオーバーロードの概念は、C などの言語とは異なり、直接サポートされていません。ただし、実行時の引数の型に基づいて関数をディスパッチできる「マルチ ディスパッチ」と呼ばれる同様の手法があります。

multipledispatch パッケージを使用したマルチ ディスパッチ

の 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート