[PYTHON] 파이썬에서 오버로드 된 함수?
PYTHON파이썬에서 오버로드 된 함수?
파이썬에서 오버로드 된 함수를 가질 수 있습니까? C #에서 나는 뭔가를 할 것이다.
void myfunction (int first, string second)
{
//some code
}
void myfunction (int first, string second , float third)
{
//some different code
}
그런 다음 함수를 호출하면 인수의 수에 따라 두 함수를 구별 할 수 있습니다. 파이썬에서 비슷한 것을 할 수 있습니까?
해결법
-
==============================
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.보통 파이썬에서는 원하는 것을 할 수 없습니다. 두 가지 근사치가 있습니다.
보통 파이썬에서는 원하는 것을 할 수 없습니다. 두 가지 근사치가 있습니다.
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.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.직접 할 수는 없습니다. 이 인수는 명시 적으로 형식 검사를 사용할 수 있습니다.
직접 할 수는 없습니다. 이 인수는 명시 적으로 형식 검사를 사용할 수 있습니다.
파이썬은 동적입니다. 객체가 무엇을 할 수 있는지 확신 할 수 없다면, 다음을 시도해보십시오. 오류를 제외하고 메소드를 호출하십시오.
형식에 기반하여 오버로드 할 필요는 없지만 인수의 개수 만 사용하려면 키워드 인수를 사용하십시오.
-
==============================
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']}
따라서 메소드 오버로딩에서리스트, 사전 또는 프리미티브 변수에 대한 처리가 이루어지고 있습니다.
당신의 코드를 시험해보십시오.
from https://stackoverflow.com/questions/7113032/overloaded-functions-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Celery (celerybeat)에 정기적 인 태스크를 동적으로 추가 / 제거하는 방법 (0) | 2018.10.10 |
---|---|
[PYTHON] MySQL 데이터베이스에 데이터를 삽입하려면 어떻게해야합니까? (0) | 2018.10.10 |
[PYTHON] 루핑하는 동안 이전 / 다음 요소에 액세스하는 방법? (0) | 2018.10.10 |
[PYTHON] ctypes에 C ++ 클래스를 사용하는 방법? (0) | 2018.10.10 |
[PYTHON] 파이썬에서 깨진 파이프 (SIGPIPE)를 처리하는 방법은 무엇입니까? (0) | 2018.10.10 |