연산자 오버로딩
Programming/Python 2013. 5. 2. 01:21 |파이썬에서는 다른 자료형에 적용되는 모든 연산을 사용자가 정의하는 클래스에서 동작할 수 있도록 구현할 수 있다.
ex) 문자열 나누기
__div__ 메소드는 나누기 연산자 '/'가 사용되었을 때 자동으로 호출된다.
파이썬은 객체 m이 __div__ 메소드를 가지고 있는가를 동적으로 검사한다. 만일 메소드를 가지고 있다면 'b'를 인수로 __div__ 메소드를 호출한다.
즉, 다음과 같이 메소드를 호출한다.
# m / 'b' 와 같은 코드
m.__dive__('b')
만일 나눗셈의 피연산자 순서를 바꾸면 어떻게 될까?
예외가 발생한다.!! 객체가 오른쪽으로 가면, __rdiv__ 메소드를 호출하기 때문이다.
그래서 __rdiv__를 정의해야 한다.
예제에서는 __div__와 __rdiv__ 메소드 내부가 동일하다.
따라서, 다음과 같이 간단히 메소드를 정의할 수 있다.
__rdiv__ = __div__
수치 연산자 메소드
※ 피연산자가 바뀐 경우의 수치 연산자 메소드 이름앞에 'r' 만 추가해주면 된다.
ex) __rshift__ => __rrshift__
※ 확장 산술 연산자 메소드 (+=, -=, *= 등등...)
메소드 이름앞에 'i' 만 추가해주면 된다.
ex) __add__ => __iadd__
Method |
Operator |
__add__(self, other) | + |
__sub__(self, other) |
- |
__mul__(self, other) |
* |
__div__(self, other) |
/ |
__truediv__(self, other) |
from __future__ import division이 실행되었다면, '/' 연산자에 의해 이 메소드 호출 |
__floordiv__(self, other) |
// |
__mod__(self, other) |
% |
__divmod__(self, other) |
divmod() |
__pow__(self, other[, module]) |
pow(), ** |
__lshift__(self, other) 만 |
<< |
__rshift__(self, other) |
>> |
__and__(self, other) |
& |
__xor__(self, other) |
^ |
__or__(self, other) |
| |
수치 단항 연산자 메소드
Method |
Operator |
__neg__(self) |
- |
__pos__(self) |
+ |
__abs__(self) |
abs() |
__invert__(self) |
~ 비트 반전 (0은 1로, 1은 0으로) |
기타 형 변환 메소드
다음의 연산자들은 객체를 인수로 하여 함수 형태로 호출된다. 그에 따른 적절한 값을 리턴해 줘야 한다.
예를 들면, int(a) 에 의해서 a.int() 가 호출된다.
.__oct__, .__hex__ 인 경우는 문자열을 리턴한다.
Method |
Opereator |
__complex__(self) |
complex() |
__int__(self) |
int() |
__long__(self) |
long() |
__float__(self) |
float() |
__oct__(self) |
oct() |
__hex__(self) |
hex() |
'Programming > Python' 카테고리의 다른 글
class 메소드 관련 (0) | 2013.05.08 |
---|---|
협동적 메소드와 super() (0) | 2013.05.07 |
생성자와 소멸자 (0) | 2013.05.02 |
class member, instance member (0) | 2013.05.02 |
정적 메소드, 클래스 메소드, 장식자 (0) | 2013.05.01 |