Eu sei que o Python não suporta sobrecarga de método, mas encontrei um problema que não consigo resolver de uma maneira Pythonic agradável.
Estou fazendo um jogo em que um personagem precisa atirar em várias balas, mas como escrevo funções diferentes para criar essas balas? Por exemplo, suponha que eu tenha uma função que crie uma bala viajando do ponto A para B com uma determinada velocidade. Eu escreveria uma função como esta:
def add_bullet(sprite, start, headto, speed):
... Code ...
Mas eu quero escrever outras funções para criar marcadores como:
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 assim por diante com muitas variações. Existe uma maneira melhor de fazê-lo sem usar tantos argumentos de palavra-chave, pois isso fica feio e rápido. Mudar o nome de cada função é muito ruim também, porque você quer receber add_bullet1
, add_bullet2
ou add_bullet_with_really_long_name
.
Para abordar algumas respostas:
Não, não posso criar uma hierarquia de classes Bullet, porque isso é muito lento. O código real para gerenciar marcadores está em C e minhas funções são wrappers em torno da API C.
Eu sei sobre os argumentos da palavra-chave, mas verificar todos os tipos de combinações de parâmetros está ficando irritante, mas argumentos padrão ajudam a colocar como
acceleration=0
default value + if + else
para fazer o mesmo que C ++. Esta é uma das poucas coisas que o C ++ tem melhor legibilidade do que o Python ...
script, curve
são, eles têm um ancestral comum, quais métodos eles suportam. Com a digitação de pato, você decide que o design da classe deve descobrir quais métodos eles precisam oferecer suporte. Presumivelmente, é Script
compatível com algum tipo de retorno de chamada baseado em timestep (mas que objeto ele deve retornar? A posição nesse timestep? A trajetória nesse timestep?). Presumivelmente, start, direction, speed
e start, headto, spead, acceleration
ambos descrevem os tipos de trajetórias, mas novamente é até você para projetar a classe recebendo saber como descompactá-los e processá-los.