Я знаю, что 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оба описывают типы траекторий, но опять же, вы должны разработать принимающий класс, чтобы знать, как распаковать его и обработать.