Programming/Python

연산자 오버로딩

scii 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()