복붙노트

[PYTHON] 파이썬에서 오버로드 된 함수?

PYTHON

파이썬에서 오버로드 된 함수?

파이썬에서 오버로드 된 함수를 가질 수 있습니까? C #에서 나는 뭔가를 할 것이다.

void myfunction (int first, string second)
{
//some code
}
void myfunction (int first, string second , float third)
{
//some different code
}

그런 다음 함수를 호출하면 인수의 수에 따라 두 함수를 구별 할 수 있습니다. 파이썬에서 비슷한 것을 할 수 있습니까?

해결법

  1. ==============================

    1.편집 Python 3.4의 새로운 단일 디스패치 제네릭 함수에 대해서는 http://www.python.org/dev/peps/pep-0443/을 참조하십시오.

    편집 Python 3.4의 새로운 단일 디스패치 제네릭 함수에 대해서는 http://www.python.org/dev/peps/pep-0443/을 참조하십시오.

    일반적으로 Python에서 함수를 오버로드 할 필요는 없습니다. 파이썬은 동적으로 타입이 지정되며 함수에 대한 선택적 인수를 지원합니다.

    def myfunction(first, second, third = None):
        if third is None:
            #just use first and second
        else:
            #use all three
    
    myfunction(1, 2) # third will be None, so enter the 'if' clause
    myfunction(3, 4, 5) # third isn't None, it's 5, so enter the 'else' clause
    
  2. ==============================

    2.보통 파이썬에서는 원하는 것을 할 수 없습니다. 두 가지 근사치가 있습니다.

    보통 파이썬에서는 원하는 것을 할 수 없습니다. 두 가지 근사치가 있습니다.

    def myfunction(first, second, *args):
        # args is a tuple of extra arguments
    
    def myfunction(first, second, third=None):
        # third is optional
    

    그러나, 만약 당신이 정말로 이것을하고 싶다면, 당신은 그것을 확실하게 일할 수 있습니다 (전통 주의자들에게 불쾌감을 줄 위험이 있음). 즉, 적절한 수의 인수와 위임을 확인하는 래퍼 (* args) 함수를 작성합니다. 이런 종류의 "해킹"은 일반적으로 데코레이터를 통해 수행됩니다. 이 경우 다음과 같은 것을 얻을 수 있습니다 :

    from typing import overload
    
    @overload
    def myfunction(first):
        ....
    
    @myfunction.overload
    def myfunction(first, second):
        ....
    
    @myfunction.overload
    def myfunction(first, second, third):
        ....
    

    overload (first_fn) 함수 (또는 생성자)가 __call __ (* args) 메서드가 위에서 설명한 위임을 수행하고 overload (another_fn) 메서드가 위임 할 수있는 추가 함수를 추가하는 호출 가능한 개체를 반환함으로써 구현합니다 .

    당신은 http://acooke.org/pytyp/pytyp.spec.dispatch.html과 비슷한 비슷한 예제를 볼 수 있습니다. 그러나 그것은 타입별로 메소드를 오버로딩합니다. 그것은 매우 유사한 접근법입니다 ...

    업데이트 : 그리고 뭔가 비슷한 (인수 형식을 사용하여) 파이썬 3 추가됩니다 - http://www.python.org/dev/peps/pep-0443/

  3. ==============================

    3.예, 가능합니다. 파이썬 3.2.1에서 아래 코드를 작성했습니다.

    예, 가능합니다. 파이썬 3.2.1에서 아래 코드를 작성했습니다.

    def overload(*functions):
        return lambda *args, **kwargs: functions[len(args)](*args, **kwargs)
    

    용법:

    myfunction=overload(no_arg_func, one_arg_func, two_arg_func)
    

    오버로드 함수에 의해 반환 된 람다는 이름없는 인수의 수에 따라 호출 할 함수를 선택합니다.

    해결책은 완벽하지는 않지만 지금은 더 나은 것을 쓸 수 없습니다.

  4. ==============================

    4.직접 할 수는 없습니다. 이 인수는 명시 적으로 형식 검사를 사용할 수 있습니다.

    직접 할 수는 없습니다. 이 인수는 명시 적으로 형식 검사를 사용할 수 있습니다.

    파이썬은 동적입니다. 객체가 무엇을 할 수 있는지 확신 할 수 없다면, 다음을 시도해보십시오. 오류를 제외하고 메소드를 호출하십시오.

    형식에 기반하여 오버로드 할 필요는 없지만 인수의 개수 만 사용하려면 키워드 인수를 사용하십시오.

  5. ==============================

    5.오버로드 방법은 파이썬에서는 까다 롭습니다. 그러나 dict, list 또는 primitive 변수를 전달하는 사용법이있을 수 있습니다.

    오버로드 방법은 파이썬에서는 까다 롭습니다. 그러나 dict, list 또는 primitive 변수를 전달하는 사용법이있을 수 있습니다.

    나는 유스 케이스에 대해 무언가를 시도했다. 이것은 사람들에게 메소드 오버로드를 이해하는 데 도움이 될 수있다.

    stackoverflow 스레드 중 하나에서 예제 사용을 보겠습니다.

    다른 클래스의 메서드를 호출하여 클래스 오버로드 메서드.

    def add_bullet (sprite = None, start = 없음, headto = 없음, spead = 없음, acceleration = 없음) :

    원격 클래스에서 인수를 전달하십시오.

    총알을 추가하십시오 (sprite = 'test', 시작 = 예, headto = { 'lat': 10.6666, 'long': 10.6666}, acceleration = 10.6)

    또는 add_bullet (sprite = 'test', 시작 = 예, headto = { 'lat': 10.6666, 'long': 10.6666}, 속도 = [ '10', '20, '30']}

    따라서 메소드 오버로딩에서리스트, 사전 또는 프리미티브 변수에 대한 처리가 이루어지고 있습니다.

    당신의 코드를 시험해보십시오.

  6. from https://stackoverflow.com/questions/7113032/overloaded-functions-in-python by cc-by-sa and MIT license