2009-04-09 1 views
58

누락 말한다 :기능이로

http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python-list/2003-May/206149.html

기능 오버로드는 파이썬에서 존재하지 않는다.

나는 이것이 OO 언어 이후로 큰 핸디캡이라고 느낀다. 처음에는 인수 유형을 구별 할 수 없다는 사실을 알게되었지만 Python의 동적 인 특성으로 인해 (예 : 목록, 튜플, 문자열은 훨씬 비슷 함) 쉽게 만들 수있었습니다.

그러나 전달 된 인수의 수를 계산 한 다음 작업을 수행하는 것은 과도한 작업과 같습니다.

+3

그래서? 과부하가 필요한 부분은 무엇이라고 생각하십니까? – kquinn

+2

진정한 질문이 아니기 때문에 투표를 종료하십시오. 그것은 잠재적으로 유효한 포인트가 아니라는 것을 말하는 것은 아니지만 질문이 아닙니다. –

+0

그럼, 오버로드를 제공하는 언어를 사용하십시오 ... –

답변

31

으로 지적 긴장을 풀고, 기본값 키워드 인자가 먼 길을 갈 수 있습니다.

필자는 필자가 생각하기에, 어떤 유형이 메소드에 전달되는지에 대해 많은 걱정을하는 것은 Python의 정신에 위배됩니다. 파이썬에서는 오리 타이핑을 사용하는 것이 더 바람직하다고 생각합니다. 물체가 무엇인지보다는 물체가 무엇을 할 수 있는지 묻습니다.같은 API 있지만

print_names("Ryan Billy") 
print_names(("Ryan", "Billy")) 

:

def print_names(names): 
    """Takes a space-delimited string or an iterable""" 
    try: 
     for name in names.split(): # string case 
      print name 
    except AttributeError: 
     for name in names: 
      print name 

이 그럼 당신은이 중 하나를 수행 할 수 있습니다 : 당신의 방법은 문자열이나 튜플을 수용 할 수있는 경우

따라서, 당신은 이런 식으로 뭔가를 할 수 때로는 디자인 문제를 나타냅니다.

+36

그런 다음 디자인 문제가없는 예제를 사용하십시오. – accuya

+1

부여되었지만 약간의 인위적인데 int/str 목록을 합산하고'[a-z]/i'가 값 1-26을 고려합니다 : https://gist.github.com/cmattoon/abeed5fb8367b0b869cf –

6

자주 사용되는 키워드 인수 대신 기본값을 사용하는 것이 좋습니다. 저것 좀 봐.

22

* args 및 ** kwargs 인수가 있으므로 함수 오버로드가 필요하지 않습니다.

실제로 함수 오버로딩은 다른 유형을 전달하면 다른 코드를 실행한다는 아이디어에 기반합니다. 파이썬과 같이 동적으로 유형이 지정된 언어를 사용하는 경우 유형별로 구별하지 말아야하지만 인터페이스와 작성한 코드를 준수해야합니다.

예를 들어, 정수 또는 정수 목록을 처리 할 수있는 코드가 있다면 iterating을 시도해 볼 수 있습니다. 그렇지 못할 경우 정수라고 가정합니다. 물론 float 일 수도 있지만, 동작에 관한 한 부동 소수점과 int가 같은 것으로 보이는 경우에는 상호 교환 될 수 있습니다.

+6

오버로드는 유형에 대한 엄격한 것이 아니며 인수의 수에 관한 것입니다. 예를 들어, 단일 메서드 이름을 공유하기 위해 접근 자 및 뮤 테이타 (또는 "getter"및 "setter")를 원할 수도 있지만 인수의 유무에 따라 별도의 작업을 수행하고 있습니다. 이것은 논증의 유형과 아무런 관련이 없습니다. – Nerdmaster

6

가변적 인 컨테이너 데이터 유형을 함수에 전달할 수 있습니다. 원하는 내용을 포함 할 수 있습니다.

다른 기능이 필요한 경우 함수의 이름을 달리 지정하거나 동일한 인터페이스가 필요한 경우받은 데이터를 기반으로 함수를 적절하게 호출하는 인터페이스 함수 (또는 메서드)를 작성하십시오. 당신이 것,

그것은 자바에서 오는이 조정받을 나에게 동안을했다,하지만 당신은 파이썬 구문을 사용하여 C++ 코드를 작성하려고하지 않는 한 정말 지금 "큰 장애"

37

밤은 과부화가 필요합니까?

정확히 반대입니다. 과부하는 강력하게 형식화 된 언어가 파이썬처럼 작동하도록하는 데 필요합니다. 파이썬에서는 키워드 인수가 있습니다. *args**kwargs입니다.

예를 들어보기 : What is a clean, pythonic way to have multiple constructors in Python?

+54

오버로드가 _ "장애가있는 언어를위한 해킹"_이라는 평가는 지나치게 극단적으로 보이고 정적 입력의 이점과 다른 유형의 배포에 대한 적합성을 간과하고 있습니다. [Stefano Borini의 대답] ("http://stackoverflow.com/a/733385/322333) _"함수 오버로딩은 다른 유형을 전달하면 다른 코드를 실행한다는 아이디어를 기반으로합니다. 동적 유형 지정 언어 파이썬, 당신은 유형으로 구별해서는 안됩니다 "_ 더 유익하고 도움이된다고 생각합니다. – boycy

+8

물론 C++에서도 가변 인수를 사용할 수 있지만 overloading은 코드를 깨끗하게 유지하는 데 사용됩니다. 에서처럼, 하나의 함수는 하나의 함수 대신에 전달 된 것에 기초하여 무엇을해야할지 파악하려고하는 if 문으로 흩어져 있습니다. – Nerdmaster