파이썬이 메소드 오버로드를 지원하지 않는다는 것을 알고 있지만 훌륭한 파이썬 방식으로는 해결할 수없는 문제가 발생했습니다.
캐릭터가 다양한 총알을 쏠 필요가있는 게임을 만들고 있는데이 총알을 만들기 위해 다른 기능을 어떻게 작성합니까? 예를 들어 주어진 속도로 A 지점에서 B 지점으로 이동하는 총알을 만드는 기능이 있다고 가정합니다. 다음과 같은 함수를 작성합니다.
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 ++이 파이썬보다 더 나은 가독성을 갖는 아주 적은 것들 중 하나입니다.
script, curve
, 공통 조상이 있는지, 어떤 방법을 지원하는지 알지 못합니다 . 오리 타이핑을 사용하면 클래스 디자인에서 지원해야 할 방법을 찾는 것이 전적으로 귀하의 몫입니다. 아마도 Script
일종의 타임 스텝 기반 콜백을 지원합니다 (그러나 어떤 객체를 반환해야합니까? 그 타임 스텝에서의 위치? 그 타임 스텝에서의 궤적?). 아마도 start, direction, speed
과 start, headto, spead, acceleration
모두 궤도의 유형에 대해 설명하지만, 다시 그들을 풀고을 처리하는 방법을 알 수있는 수신 클래스를 설계하는 당신에게 달려 있습니다.