1 분 소요

파이썬 내장함수 __str__, __repr__?

/ __str__ / __repr__ /

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return '{0}: {1}'.format(self.name, self.age)

def main():
    p = Person('Jack',23)
    print(p)

main()
  • 위와같이 __str__ 이 print로 출력하는 일반 문자열을 표기하는 방식이며 오버라이딩을해서 쓸 수도 있다.
  • 반면 __repr__은 객체 생성방법을 알 수 있도록 하는 표준 문자열 표시방식이다.

__str____repr__ 의 차이점

str의 경우 흔히 아래와 같이 사용을 한다.

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

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

내장함수 __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__을 사용하면 된다.

출처 : https://recordnb.tistory.com/47 https://docs.python.org/ko/3.9/library/functions.html ](https://docs.python.org/ko/3.9/library/functions.html#repr)

댓글남기기