Перегрузка функции Python - PullRequest
163 голосов
/ 22 июня 2011

Я знаю, что 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.

Чтобы ответить на некоторые ответы:

  1. Нет, я не могу создать иерархию класса Bullet, потому что это слишком медленно. Фактический код для управления маркерами находится на C, а мои функции - обертки вокруг C API.

  2. Я знаю об аргументах ключевых слов, но проверка на все виды комбинаций параметров становится раздражающей, но аргументы по умолчанию помогают выделить как acceleration=0

Ответы [ 13 ]

3 голосов
/ 22 июня 2011

Либо используйте несколько аргументов ключевого слова в определении, либо создайте иерархию Bullet, экземпляры которой передаются в функцию.

2 голосов
/ 30 декабря 2016

перегрузка методов сложна в Python. Однако может использоваться передача переменных dict, list или primitive.

Я пробовал что-то для своих вариантов использования, это может помочь здесь понять людей, перегружающих методы.

Давайте возьмем ваш пример:

метод перегрузки класса с вызовом методов из другого класса.

def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):

передать аргументы из удаленного класса:

add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},accelaration=10.6}

ИЛИ

add_bullet(sprite = 'test', start=Yes, headto={'lat':10.6666,'long':10.6666},speed=['10','20,'30']}

Итак, выполняется обработка для списка, словаря или примитивных переменных из-за перегрузки метода.

опробуйте его для своих кодов.

2 голосов
/ 22 июня 2011

Использовать аргументы ключевых слов со значениями по умолчанию.Например,

def add_bullet(sprite, start=default, direction=default, script=default, speed=default):

В случае прямой пули и изогнутой пули я бы добавил две функции: add_bullet_straight и add_bullet_curved.

...