So che Python non supporta il sovraccarico del metodo, ma ho riscontrato un problema che non riesco a risolvere in un buon modo Pythonic.
Sto realizzando un gioco in cui un personaggio deve sparare una varietà di proiettili, ma come faccio a scrivere diverse funzioni per creare questi proiettili? Ad esempio supponiamo che io abbia una funzione che crea un proiettile che viaggia dal punto A a B con una data velocità. Vorrei scrivere una funzione come questa:
def add_bullet(sprite, start, headto, speed):
... Code ...
Ma voglio scrivere altre funzioni per la creazione di proiettili come:
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 ...
E così via con molte varianti. C'è un modo migliore per farlo senza usare così tanti argomenti di parole chiave che lo fanno diventare piuttosto brutto in fretta. Rinominare ogni funzione è piuttosto male anche perché si ottiene uno add_bullet1
, add_bullet2
o add_bullet_with_really_long_name
.
Per rispondere ad alcune risposte:
No, non riesco a creare una gerarchia di classi Bullet perché è troppo lenta. Il codice effettivo per la gestione dei proiettili è in C e le mie funzioni sono involucri attorno all'API C.
Conosco gli argomenti delle parole chiave, ma verificare ogni tipo di combinazione di parametri sta diventando fastidioso, ma gli argomenti predefiniti aiutano a assegnare simili
acceleration=0
default value + if + else
per fare lo stesso di C ++. Questa è una delle poche cose in cui C ++ ha una migliore leggibilità di Python ...
script, curve
siano, hanno un antenato comune, quali metodi supportano. Con la tipizzazione anatra, spetta a te per il design di classe capire quali metodi devono supportare. Presumibilmente Script
supporta una sorta di callback basato su timestep (ma quale oggetto dovrebbe restituire? La posizione in quel timestep? La traiettoria in quel timestep?). Presumibilmente start, direction, speed
ed start, headto, spead, acceleration
entrambi descrivono i tipi di traiettorie, ma di nuovo tocca a te progettare la classe ricevente per sapere come decomprimerli ed elaborarli.