특별 메서드는 어떻게 사용되나

매일 공부(ML)·2022년 10월 27일
0

Fluent Python

목록 보기
2/130

파이썬 데이터 모델

특별 메서드는 어떻게 사용이 되는가?

  • 특별 메서드는 파이썬 인터프리터가 호출하는 것이지 사용자가 직접 호출하는 것은 아닙니다.
  • 내장 함수를 활용하면 해당 특별 메서드를 빠르게 호출한다.
  • 사용자 정의 속성을 만들 때는 앞 뒤로 이중 언더바를 가진 foo와 같은 형태의 속성명은 피하라
    • 나중에 특별한 의미를 갖도록 정의가 가능하다.

수치형 흉내 내기

  • +와 같은 연산자에 사용자 정의 객체가 응답할 수 있게 헤주는 몇몇 특별 메서드가 있다.

  • 2차원 유큘리드 벡터를 나타내는 클래스를 구현한다.

v1 = Vector(2,4)
v2 = Vector(2,1)

v1 + v2 # Vector(4,5)

  • 연산자의 결과로 Vector형이 나온다는 점에 주의하여 Vector 형은 콘솔에서 Vector로 표현하므로 내장된 abs() 함수는 정수나 실수의 절댓값을 반환하고, complex 형의 경우에도 값을 한 개만 반환하기에 API역시 벡터의 크기를 계산하는데 abs() 함수를 사용한다.
v = Vector(3,4)
abs(v) #5.0

  • 연산자를 사용하여 스칼라곱을 수행할 수 있다.
v*3
#Vector(9,12)
abs(v * 3) #15.0

repr(), abs(), add(), mul() 특별 메서드를 이용하여 방금 설명한 연산을 구현

from math import hypot

class Vector:
	def __init__(self, x=0,y=0):
    	self.x = x
        self.y = y
        
    def __repr__(self):
    	return 'Vector(%r,%r)' % (self.x, self.y)
        
    def __abs__(self):
    	return hypot(self.x, self.y)
        
    def __bool__(self):
    	return bool(abs(self))
        
    def __add__(self, other):
    	x = self.x + other.x
        y = self.y + other.y
        return Vector(x,y)
        
    def __mul__(self, scalar):
    	return Vector(self.x * scalar, self.y * scalar)

init()을 제외하고 5개의 특별 메서드를 구현했지만, 클래스 내부나 콘솔의 테스트 코드에선 직접적으로 호출하지는 않는다는 점을 주의해야한다.


문자열 표현

  • repr() 특별 메서드는 객체를 문자열로 표현하기 위해서 repr() 내장 메서드에 의해서 호출이 된다.

    • repr() 메서드를 구현하지 않을 경우 Vector 객체는 콘솔과 같은 형태로 출력된다.
    • 출력할 속성의 표준 표현을 가져오기 위해서 %r을 사용한다.
  • %연산자를 사용하는 고전적인 포맷 문자열에서의 %r 플레이스홀더

  • repr() 메서드가 반환한 문자열은 명확해야 하며, 가능하다면 표현된 객체를 재생성하는데 필요한 소스 코드와 일치해야 한다.

    • 우리가 선택한 표현은 Vector(3,4)처럼 클래스 생성자를 호출하는 모습과 동일하다.
  • repr()과 str()을 비교한다

    • str()메서드는 str() 생성자에 의해서 호출되고 print()함수를 암묵적으로 사용된다.
    • str()은 사용자에게 보여주기 적당한 형태의 문자열을 반환해야 한다.
  • 위의 두 가지 특별 메서드 중 하나만 구현해야 한다면, repr() 메서드를 구현하라.

  • 파이썬 인터프리터가 str() 메서드가 구현되지 않을 경우 repr()메서드를 호출하기 때문이다.


산술 연산자

add()와 mul()의 기본 사용법을 보여주기 위해서 + 와 * 연산자를 구현하고 이 경우 모두 메서드는 Vector 객체를 새로 만들어서 반환하고 두 개의 피연산자는 변경하지 않는다. 중위 연산자는 의례적으로 피연산자를 변경하지 않고 객체를 새로 만든다.


사용자 정의형의 불리언 값

  • 피연산자(if, while, or, not)로서 불리언형이 필요한 곳에선 어떠한 객처라도 사용 가능

    • x가 참된 값인지 거짓된 값인지 판단하기 위해서 bool(x)를 적용하고, 항상 True or False 반환
  • bool()이나 len()을 구현하지 않는 경우, 사용자 정의 클래스의 객체는 참된 값이라고 간주한다.

    • bool(x)는 x.bool()을 호출한 결과를 이용한다.
    • bool()이 구현되어 있지 않다면 파이썬은 x.len()을 호출한다
    • 특별 메서드가 0을 반환하면, bool()은 False, 그렇지 않으면 True를 반환한다.
  • 구현할 bool(x)의 개념

    • 벡터의 크기가 0 False 그렇지 않으면 True
    • bool()은 불리언형을 반환해야 하므로 bool(abs(self))를 이용해서 크기를 불리언형으로 변환한다.
profile
성장을 도울 아카이빙 블로그

0개의 댓글