Je sais que Python ne prend pas en charge la surcharge de méthode, mais j'ai rencontré un problème que je n'arrive pas à résoudre d'une manière sympa Pythonic.
Je fais un jeu où un personnage doit tirer une variété de balles, mais comment puis-je écrire différentes fonctions pour créer ces balles? Par exemple, supposons que j'ai une fonction qui crée une balle se déplaçant du point A vers B avec une vitesse donnée. J'écrirais une fonction comme celle-ci:
def add_bullet(sprite, start, headto, speed):
... Code ...
Mais je veux écrire d'autres fonctions pour créer des puces comme:
def add_bullet(sprite, start, direction, speed):
def add_bullet(sprite, start, headto, spead, acceleration):
def add_bullet(sprite, script): # For bullets that are controlled by a script
def add_bullet(sprite, curve, speed): # for bullets with curved paths
... And so on ...
Et ainsi de suite avec de nombreuses variantes. Existe-t-il une meilleure façon de le faire sans utiliser autant d'arguments de mots clés, cela devient un peu laid rapidement. Changement de nom chaque fonction est assez mal aussi parce que vous obtenez soit add_bullet1
, add_bullet2
ou add_bullet_with_really_long_name
.
Pour répondre à certaines réponses:
Non, je ne peux pas créer une hiérarchie de classes Bullet car c'est trop lent. Le code réel pour la gestion des puces est en C et mes fonctions sont des wrappers autour de l'API C.
Je connais les arguments des mots clés, mais vérifier toutes sortes de combinaisons de paramètres devient ennuyeux, mais les arguments par défaut aident à attribuer comme
acceleration=0
default value + if + else
pour faire la même chose que C ++. C'est l'une des très rares choses que C ++ a une meilleure lisibilité que Python ...
script, curve
sont, ont-ils un ancêtre commun, quelles méthodes ils prennent en charge. Avec la frappe de canard, c'est à vous de concevoir la classe pour déterminer les méthodes dont ils ont besoin pour prendre en charge. Script
Prend probablement en charge une sorte de rappel basé sur le pas de temps (mais quel objet doit-il retourner? La position à ce pas de temps? La trajectoire à ce pas de temps?). Vraisemblablement start, direction, speed
, les start, headto, spead, acceleration
deux décrivent les types de trajectoires, mais encore une fois, c'est à vous de concevoir la classe de réception pour savoir comment les déballer et les traiter.