Maison >développement back-end >Tutoriel Python >Comment Python obtient-il un comportement de type surcharge de méthode ?

Comment Python obtient-il un comportement de type surcharge de méthode ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-21 13:36:20738parcourir

How Does Python Achieve Method Overloading-like Behavior?

Surcharge de méthode en Python

En Python, le concept de surcharge de méthode n'est pas directement pris en charge comme c'est le cas dans des langages comme C . Cependant, il existe une technique similaire appelée « répartition multiple » qui permet de répartir les fonctions en fonction des types de leurs arguments au moment de l'exécution.

Répartition multiple avec package multipledispatch

Le package multipledispatch dans Python fournit un moyen d'implémenter plusieurs fonctionnalités de répartition. Il permet d'enregistrer des fonctions avec des types d'arguments spécifiques, permettant leur sélection dynamique au moment de l'exécution.

Solution

À l'aide du package multipledispatch, vous pouvez définir plusieurs fonctions avec le même nom, en spécifiant des arguments différents. combinaisons de types :

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")

Utilisation

Pour utiliser les fonctions enregistrées, appelez simplement la fonction souhaitée avec l'argument approprié types :

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)

Cette approche offre une flexibilité dans la création de fonctions avec différentes combinaisons d'arguments tout en évitant les inconvénients de la surcharge en Python.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn