Ich weiß, dass Python das Überladen von Methoden nicht unterstützt, aber ich bin auf ein Problem gestoßen, das ich scheinbar nicht auf nette pythonische Weise lösen kann.
Ich mache ein Spiel, in dem ein Charakter eine Vielzahl von Kugeln abschießen muss, aber wie schreibe ich verschiedene Funktionen zum Erstellen dieser Kugeln? Angenommen, ich habe eine Funktion, die eine Kugel erzeugt, die sich mit einer bestimmten Geschwindigkeit von Punkt A nach B bewegt. Ich würde eine Funktion wie diese schreiben:
def add_bullet(sprite, start, headto, speed):
... Code ...
Aber ich möchte andere Funktionen zum Erstellen von Aufzählungszeichen schreiben wie:
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 ...
Und so weiter mit vielen Variationen. Gibt es einen besseren Weg, dies zu tun, ohne so viele Schlüsselwortargumente zu verwenden, dass es schnell hässlich wird? Jede Funktion Umbenennen ist ziemlich schlecht auch , weil Sie entweder add_bullet1
, add_bullet2
oder add_bullet_with_really_long_name
.
Um einige Antworten zu finden:
Nein, ich kann keine Bullet-Klassenhierarchie erstellen, da dies zu langsam ist. Der eigentliche Code zum Verwalten von Aufzählungszeichen befindet sich in C, und meine Funktionen sind Wrapper für die C-API.
Ich kenne die Schlüsselwortargumente, aber das Überprüfen auf alle möglichen Kombinationen von Parametern wird ärgerlich, aber Standardargumente helfen bei der Auswahl
acceleration=0
default value + if + else
, um das gleiche wie C ++ zu tun. Dies ist eines der wenigen Dinge, die C ++ besser lesbar macht als Python ...
script, curve
sind, haben sie einen gemeinsamen Vorfahren, welche Methoden sie unterstützen. Beim Entenschreiben liegt es an Ihnen, für das Klassendesign herauszufinden, welche Methoden sie unterstützen müssen. Script
Unterstützt vermutlich eine Art zeitschrittbasierten Rückruf (aber welches Objekt sollte es zurückgeben? Die Position zu diesem Zeitschritt? Die Flugbahn zu diesem Zeitschritt?). Vermutlich start, direction, speed
und start, headto, spead, acceleration
beide beschreiben Arten von Trajektorien, aber es liegt wieder an Ihnen, die empfangende Klasse so zu gestalten, dass Sie wissen, wie Sie sie entpacken und verarbeiten können.