Overriding 이 부모 클래스와 관련이 있다면, Overloading은 메소드끼리의 관련이 있다. (파라미터 관련)
1. 동일 메소드 재정의
2. 네이밍으로 기능 예측 가능
3. 코드 절약, 가독성 향상
4. ⭐️ 메소드 파라미터 기반 호출 방식
- 오버라이딩과 가장 크게 다른 특징이다!
- 파라미터 개수나 타입에 따라서 올바른 함수가 호출이 된다.
a = 100
a = "String"
자료형에 따른 분기 처리를 해보자
datatype, args
를 입력 받아서 데이터 타입에 따라 처리해줬다.
class SampleB():
def add(self, datatype, *args):
# 데이터 타입이 int이면 sum 함수
if datatype =='int':
return sum(args)
# 데이터 타입이 str이면 join 함수
if datatype =='str':
return ''.join(x for x in args)
b = SampleB()
# 숫자 연산
print('ex 2 > ',b.add('int',5,6))
# 문자열 연산
print('ex 2 > ',b.add('str','hello ','wolrd'))
class SampleA():
def add(self,x,y):
print('파라미터가 두개인 add 호출')
return x+y
def add(self,x,y,z):
print('파라미터가 세개인 add 호출')
return x+y+z
a = SampleA()
print('ex 1 > ',a.add(2,3))
# error 발생
# TypeError: add() missing 1 required positional argument: 'z'
print('ex 1>', dir(a))
# [ ... , 'add'] add 메소드가 하나이다.
a.add(2,3)를 호출하니 타입 에러가 발생했다.
파이썬에서는 클래스 내에서 메소드 오버로딩을 지원하지 않기 때문이다.
클래스 내 메소드 오버로딩을 지원하게 만드는 것이 multiple dispatch이다.
multipledispatch 패키지를 통한 메소드 오버로딩을 해보자
$pip install multipledispatch
패키지를 먼저 설치해주고, import 해주자
from multipledispatch import dispatch
class SampleC():
@dispatch(int,int)
def product(x, y):
return x * y
@dispatch(int,int,int)
def product(x, y ,z):
return x * y * z
@dispatch(float,float)
def product(x, y):
return x * y
c = SampleC()
# 정수 파라미터 두개
print('ex 3 > ',c.product(2, 3))
# 정수 파라미터 세개
print('ex 3 > ',c.product(2, 3, 4))
# 실수 파라미터 두개
print('ex 3 > ',c.product(2.0, 3.0))
2번 예제에서 보았듯이 파이썬에선 클래스 내의 메소드 오버로딩을 지원하지 않는다.
그렇지만 multipledispatch 패키지를 통해 해당 기능을 사용할 수 있게 됐다.
@dispatch(자료형)
을 붙여서 사용한다.[ 출처 ]