본문 바로가기

Dev/Python

[Python] 내장 함수 __str__, __repr__

Python 3.9

 

파이썬에는 내장 함수가 구현되어 있습니다.

내장 함수란 자주 사용되는 기능들을 사전에 구현해 놓은 것입니다.

여러 내장 함수들이 있고 그중 __str__과 __repr__에 대해 알아보려 합니다.

 

시작하기에 앞서 우리가 보통 호출하는 str은 내장 함수 __str__과는 다른 것입니다.

str의 경우 흔히 아래와 같이 사용을 하고 있습니다.

a=3
print (type(a))
# <class 'int'>

str_a = str(a)
print (type(str_a))
# <class 'str'>

위의 예제에서 사용된 str은 내장 클래스를 사용한 것입니다.

str(a)는 str이라는 내장 클래스의 생성자 메소드를 이용하여 객체를 생성한 것입니다.

 

다시 내장 함수로 돌아가도록 하겠습니다.

class Color():
    def __init__(self,name):
        self.name = name

red = Color('red')
yellow = Color('yellow')
black = Color('black')

arr = [red, yellow, black]

for ar in arr:
    print (ar)
    
<__main__.Color object at 0x00D663E8>
<__main__.Color object at 0x00D66448>
<__main__.Color object at 0x00D66478>

Color 함수를 정의하고 객체를 3개 만들었습니다.

이후 출력을 하였을 때 Color함수의 메모리 주소가 나오게 됩니다.

함수에 __str__, __repr__을 정의하지 않았기 때문입니다.

 

class Color():
    def __init__(self,name):
        self.name = name
    
    def __str__(self):
        return f'__str__: {self.name=}'
    
    def __repr__(self):
        return f'__repr__: {self.name=}'

red = Color('red')
yellow = Color('yellow')
black = Color('black')

arr = [red, yellow, black]

for ar in arr:
    print (ar)
    
__str__: self.name='red'
__str__: self.name='yellow'
__str__: self.name='black

__str__ 함수와 __repr__함수를 추가한 뒤, 출력을 하였을 때 __str__의 함수가 호출되는 것을 확인할 수 있었습니다.

 

만약 __repr__함수만 정의하였을 때는 아래와 같이 출력됩니다.

__repr__: self.name='red'
__repr__: self.name='yellow'
__repr__: self.name='black'

위를 통해 출력을 할 때 __str__이 __repr__보다 우선순위가 높다는 것을 알 수 있었습니다.

 

그리고 위에서 arr이라는 리스트에 각 객체들을 담았는데 아래와 같이 호출을 하면 __repr__의 함수가 호출됩니다.

print(arr)

[__repr__: self.name='red', __repr__: self.name='yellow', __repr__: self.name='black']

만약 __repr__이 정의되지 않았다면 각 객체의 메모리주소가 출력됩니다.

 

위의 내용을 정리하면 클래스를 생성할 때 해당 클래스의 정보를 출력하기 위해 또는 표현하고자 하는 내용은

__str__과 __repr__을 통해 정의합니다.

 

 

그리고 이 두 내장 함수의 차이가 무엇인지에 대해 알아보았습니다.

__str__의 목적은 문자열화를 하여 서로 다른 객체 간의 정보를 전달하는 데 사용하는 것이고

__repr__은 인간이 이해할 수 있는 표현으로 나타내기 위한 것입니다.

 

즉 해당 클래스에 대해 사용자에게 정보를 전달하고 싶은 경우 __repr__을 사용하고

해당 클래스의 특정 데이터를 다른 객체들 간에 전달하고 싶은 경우 __str__을 사용하면 됩니다.

그래서 __str__이 우선순위가 더 높은 것이 아닐까 라는 생각이 됩니다.

 

 

출처 : Python 3.9.7 문서

https://docs.python.org/ko/3.9/library/functions.html

 

내장 함수 — Python 3.9.7 문서

내장 함수 파이썬 인터프리터에는 항상 사용할 수 있는 많은 함수와 형이 내장되어 있습니다. 여기에서 알파벳 순으로 나열합니다. abs(x) 숫자의 절댓값을 돌려줍니다. 인자는 정수, 실수 또는 __

docs.python.org

 

str 내장 클래스에 대한 설명

https://docs.python.org/ko/3.9/library/stdtypes.html#str

 

내장형 — Python 3.9.7 문서

다음 섹션에서는 인터프리터에 내장된 표준형에 관해 설명합니다. 기본 내장 유형은 숫자, 시퀀스, 매핑, 클래스, 인스턴스 및 예외입니다. 일부 컬렉션 클래스는 가변입니다. 제자리에서 멤버

docs.python.org