Я знаю, что Python не поддерживает перегрузку методов, но я столкнулся с проблемой, которую не могу решить хорошим способом Pythonic.
Я делаю игру, в которой персонаж должен стрелять различными пулями, но как мне написать разные функции для создания этих пуль? Например, предположим, у меня есть функция, которая создает пулю, путешествующую из точки А в точку Б с заданной скоростью. Я бы написал такую функцию:
def add_bullet(sprite, start, headto, speed):
... Code ...
Но я хочу написать другие функции для создания пуль, такие как:
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 ...
И так со многими вариациями. Есть ли лучший способ сделать это, не используя так много ключевых аргументов, потому что это становится довольно быстро. Переименование каждой функции очень плохо тоже , потому что вы получаете либо add_bullet1
, add_bullet2
или add_bullet_with_really_long_name
.
Чтобы ответить на некоторые ответы:
Нет, я не могу создать иерархию класса Bullet, потому что это слишком медленно. Фактический код для управления маркерами находится на C, а мои функции - обертки вокруг C API.
Я знаю об аргументах ключевых слов, но проверка на все виды комбинаций параметров становится раздражающей, но аргументы по умолчанию помогают выделить как
acceleration=0
default value + if + else
чтобы сделать то же самое, что и C ++. Это одна из немногих вещей, которые C ++ имеет лучшую читаемость, чем Python ...
script, curve
есть ли у них общий предок, какие методы они поддерживают. С помощью duck-typing вам нужно, чтобы дизайн класса выяснил, какие методы они должны поддерживать. Предположительно Script
поддерживает своего рода обратный вызов на основе временного шага (но какой объект должен возвращать «позицию на этом временном шаге» траекторию на этом временном шаге »). Предположительно, start, direction, speed
и start, headto, spead, acceleration
оба описывают типы траекторий, но опять же, вы должны разработать принимающий класс, чтобы знать, как распаковать его и обработать.