Я знаю, що Python не підтримує перевантаження методом, але я зіткнувся з проблемою, яку я, здається, не можу вирішити приємно пітонічно.
Я роблю гру, де персонаж повинен стріляти з різних куль, але як я можу писати різні функції для створення цих куль? Наприклад, припустимо, у мене є функція, яка створює кулю, яка рухається від точки А до В із заданою швидкістю. Я б написав таку функцію:
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
, чи є у них спільний предок, які методи вони підтримують. Завдяки набору тексту качок вирішувати, які методи вони повинні підтримувати. Імовірно, Script
підтримується якийсь зворотний виклик на основі часового кроку (але який об’єкт він повинен повертати? Позиція в цьому часовому кроці? Траєкторія на цьому етапі?). Імовірно , start, direction, speed
і start, headto, spead, acceleration
обидва описують типи траєкторій, але знову - таки це до вас , щоб розробити отримує клас , щоб знати , як їх розпакувати й обробляти їх.