Wiem, że Python nie obsługuje przeciążania metod, ale napotkałem problem, którego nie potrafię rozwiązać w przyjemny Python.
Tworzę grę, w której postać musi strzelać różnymi kulami, ale jak napisać różne funkcje do tworzenia tych kul? Załóżmy na przykład, że mam funkcję, która tworzy pocisk przemieszczający się z punktu A do B z określoną prędkością. Napiszę taką funkcję:
def add_bullet(sprite, start, headto, speed):
... Code ...
Ale chcę napisać inne funkcje do tworzenia pocisków, takie jak:
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 ...
I tak z wieloma odmianami. Czy jest lepszy sposób, aby to zrobić bez użycia tak wielu argumentów słowa kluczowego, że robi się trochę brzydko szybko. Zmiana nazwy poszczególnych funkcji jest bardzo złe zbyt, ponieważ można uzyskać albo add_bullet1
, add_bullet2
albo add_bullet_with_really_long_name
.
Aby odpowiedzieć na niektóre odpowiedzi:
Nie, nie mogę utworzyć hierarchii klas Bullet, ponieważ jest to zbyt wolne. Rzeczywisty kod do zarządzania punktorami znajduje się w C, a moje funkcje są otoczone przez C API.
Wiem o argumentach słów kluczowych, ale sprawdzanie wszelkiego rodzaju kombinacji parametrów staje się denerwujące, ale domyślne argumenty pomagają przydzielić
acceleration=0
default value + if + else
tego samego co C ++. Jest to jedna z niewielu rzeczy, które C ++ ma lepszą czytelność niż Python ...
script, curve
, czy mają wspólnego przodka, jakie metody obsługują. W przypadku pisania typu „kaczor” to od Ciebie zależy, czy projekt klasowy obliczy, jakie metody muszą obsługiwać. Przypuszczalnie Script
obsługuje pewnego rodzaju wywołanie zwrotne oparte na taktowaniu czasu (ale jaki obiekt powinien zwrócić? Pozycję w tym czasie? Trajektorię w tym czasie?). Prawdopodobnie start, direction, speed
i start, headto, spead, acceleration
oba opisują rodzaje trajektorii, ale znowu to od Ciebie zależy zaprojektowanie klasy odbierającej, aby wiedziała, jak ją rozpakować i przetworzyć.