developer tip

Python의 함수 오버로딩 : 누락

copycodes 2020. 12. 1. 08:21
반응형

Python의 함수 오버로딩 : 누락


이것이 말한다 :

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

Python에는 함수 오버로딩이 없습니다.

OO 언어이기 때문에 이것이 큰 핸디캡이라고 생각하는 한. 처음에는 인자 유형을 구별 할 수 없다는 것이 어려웠지만 Python의 동적 특성으로 인해 쉬워졌습니다 (예 : 목록, 튜플, 문자열은 매우 유사 함).

그러나 전달 된 인수의 수를 세고 작업을 수행하는 것은 과잉과 같습니다.


unwind가 언급했듯이 기본값이있는 키워드 인수는 먼 길을 갈 수 있습니다.

또한 어떤 유형이 메소드로 전달되는지에 대해 많이 걱정하는 것은 Python의 정신에 위배된다고 생각합니다. 파이썬에서는 덕 타이핑을 사용하는 것이 더 받아 들여 진다고 생각합니다. 객체가 무엇인지보다는 무엇을 할 수 있는지 묻는 것입니다.

따라서 메서드가 문자열이나 튜플을 받아 들일 수 있다면 다음과 같이 할 수 있습니다.

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

그런 다음 다음 중 하나를 수행 할 수 있습니다.

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

이와 같은 API는 때때로 디자인 문제를 나타냅니다.


이제 Python 구문을 사용하여 C ++ 코드를 작성하지 않는 한 오버로딩이 필요한 것은 무엇입니까?

정확히 반대라고 생각합니다. 오버로딩은 강력한 형식의 언어가 Python처럼 작동하도록 만드는 데만 필요합니다. Python에는 키워드 인수가 있으며 *args**kwargs.

예를 들어보십시오 : Python에서 여러 생성자를 갖는 깔끔하고 비단뱀적인 방법은 무엇입니까?


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

사실 함수 오버로딩은 서로 다른 유형을 전달하면 서로 다른 코드를 실행할 것이라는 생각을 기반으로합니다. 파이썬과 같이 동적으로 유형이 지정된 언어를 사용하는 경우 유형별로 구별해서는 안되지만 인터페이스와 작성하는 코드의 준수를 처리해야합니다.

예를 들어, 정수 또는 정수 목록을 처리 할 수있는 코드가있는 경우 반복을 시도 할 수 있으며 할 수없는 경우 정수라고 가정하고 앞으로 진행합니다. 물론 그것은 float 일 수 있지만, 동작에 관한 한, float와 int가 동일 해 보이면 서로 교환 될 수 있습니다.


종종 대신 기본값과 함께 키워드 인수를 사용하라는 제안을 볼 수 있습니다. 저것을보세요.


변경 가능한 컨테이너 데이터 유형을 함수에 전달할 수 있으며 원하는 모든 것을 포함 할 수 있습니다.

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

Java에서 오는이 문제에 적응하는 데 시간이 좀 걸렸지 만 실제로는 "큰 핸디캡"이 아닙니다.

참고 URL : https://stackoverflow.com/questions/733264/function-overloading-in-python-missing

반응형