단항 연산자

매일 공부(ML)·2023년 3월 9일
0

Fluent Python

목록 보기
93/130

객체지향 상용구

연산자 오버로딩: 제대로 하기

단항 연산자

단항 연산자는 self 인수 하나를 받는 적절한 특별 메서드를 구현하기에ㅔ 쉽다. 물론, 클래스에 논리적으로 합당한 연산을 수행해야 하므로 self를 수정하지 말고 적절한 자료형의 객체를 새로 생성해서 반환해야 한다.


단적으로, +와-인 경우 결과는 아마도 self와 같은 클래스의 객체로 +의 경우 일반적으로 self의 사본을 반환하는 것이 좋다.

abs()의 경우 스칼라형 숫자가 결과로 나온다.

~의 경우 정수이외의 피연산자에 적용한다면 어떤 값이 나와야 하는지 확답하기 어렵고, ORM에서 ~를 사용하면 SQL의 WHERE 구를 부정한 결과를 반환하는 것이 타당하다.

#vector_v6.py: 단항 연산자 - 와 + 추가

def __abs__(self):
	return math.sqrt(sum(x * x for x in self))
    
def __neg__(self):
	return Vector(-x for x in self)

def __pos__(self):
	return Vector(self)

Vector 객체를 반복할 수 있고, Vector.init()이 반복형 인수를 받으므로 neg()와 pos()를 짧고 멋지게 구현할 수 있다.

invert() 메서드는 구현하지 않을 것이므로 Vector 객체에 ~v 연산을 실행하면 파이썬은 단항 연산자 ~에 맞지 않는 피연산자라는 것을 의미하는 'bad operand type for unary ~: 'Vector"."메시지와 함께 TypeError가 발생한다.


x와 +x가 동일하지 않은 경우

#산술 콘텍스트의 정밀도를 변경하면 x와 +x가 달라질 수 있다.

import decimal
ctx = decimal.getcontext()
ctx.prec = 40
one_third = decimal.Decimal('1') / decimal.Decimal('3')
one_third == +one_third
ctx.prec = 28
one_third == +one_third
+one_third

#단항 연산자 +는 합계가 0이 아닌 음수인 항목을 제외하고 Counter 객체를 새로 생성한다.
ct  = Counter('abracadabra')
ct
profile
성장을 도울 아카이빙 블로그

0개의 댓글