728x90
반응형
- 개요
함수의 오버로딩은 로직은 동일하지만 함수의 인자의 개수나 인자의 타입이 다른 경우에 사용할 수 있다
하지만 파이썬은 런타임 시점에서 변수의 자료형을 결정하는 동적 타입 언어로서
공식적인 방법으로는 함수 오버로딩 기능을 사용할 수 없다
하지만 파이썬에서도 함수 오버로딩을 구현할 수 있는 몇 가지 방법이 존재한다
각각 다음과 같이 표현할 수 있다
- 패킹을 통한 함수의 인자를 객체화하여 함수 오버로딩 구현
- 함수 내에서 자료형에 따른 분기를 통해 함수 오버로딩 구현
- 외부 플러그인 multipledispatch을 사용하여 함수 오버로딩 구현
1) 패킹을 통한 함수 오버로딩 구현
class SampleA():
# 패킹을 통해 오버로드를 수행
def add(selfsel, *args):
return sum(args)
a = SampleA()
print(f"add ver 01 {a.add(10, 20)}")
print(f"add ver 02 {a.add(10, 20, 30)}")
print(f"add ver 03 {a.add(1.05, 1.02, 1.03)}")
함수 add에서 * 연산자를 사용하여 함수의 인자를 패킹하여 하나의 인스턴스로 합칠수 있다
위의 예시에서 2개의 정수 / 3개의 정수 / 3개의 실수를 인자로 add 함수를 수행한다

실행 결과는 위와 같다
각기 다른 인자에 대한 연산이 이뤄진 것을 확인할 수 있다
2) 자료형에 따른 분기로 함수 오버로딩 구현
class SampleB():
def add(self, datatype, *args):
if datatype == 'int':
return sum(args)
if datatype == 'str':
return ''.join([word for word in args])
b = SampleB()
print(f"add ver 01 {b.add('str', "app", "ple")}")
print(f"add ver 02 {b.add('int', 20, 30)}")
함수 add에서 패킹한 인스턴스를 인자로 받는 부분은 동일하지만,
인자로 datatype을 추가하여 각 자료형에 따라 분기하여 로직이 동작한다
따라서 1)의 예시에서 처리하지 못하는 문자열도 처리할 수 있다

실행 결과는 위와 같다
정수말고 문자열도 문제없이 처리된 것을 볼 수 있다
3) multipledispatch 플러그인을 사용하여 함수 오버로딩 구현
from multipledispatch import dispatch
class SampleC():
@dispatch(int, int)
def add(self, x, y):
return x + y
@dispatch(int, int, int)
def add(self, x, y, z):
return x + y + z
@dispatch(str, str, str)
def add(self, w1, w2, w3):
return w1 + w2 + w3
c = SampleC()
print(f"add ver 01 {c.add(10, 20)}")
print(f"add ver 02 {c.add(20, 30, 50)}")
print(f"add ver 03 {c.add("Hello,", "World ", "from Python")}")
외부 플러그인 multipledispatch로부터 dispatch를 임포트하고
함수에 @dispatch(인자1의 자료형, ...)의 형태로 어노테이션을 작성하면 함수 오버로딩을 구현할 수 있다

실행 결과는 위와 같다
2개의 정수 / 3개의 정수 / 3개의 문자열에 해당하는 인자를 사용해도
add 함수가 문제없이 동작하는 것을 확인할 수 있다
728x90
반응형
'Python > 파이썬 오픈소스 배포' 카테고리의 다른 글
| 메타 클래스 (2) (0) | 2025.07.05 |
|---|---|
| 메타 클래스 (1) (0) | 2025.07.04 |
| 메서드 오버라이딩 (0) | 2025.07.01 |
| Getter 메서드와 Setter 메서드 (0) | 2025.07.01 |
| 언더스코어(_)의 사용 (0) | 2025.06.30 |