파이썬 __str__ , __repr__의 차이

파이썬 매직메서드로

__str__, __repr__ 이 있습니다.

 

둘다 객체의 문자열 표현을 반환한다는 특징을 가지고 있죠.

 

 

같은 기능을 하는데 왜 구분해놨을까?

차이를 한 번 살펴봅시다.

 

__str__ 메서드

  • 객체의 "비공식적" 또는 사용자 친화적 문자열을 표현할 때 제공합니다.
  • print() 함수나 str() 함수를 사용할 때 호출됩니다.

 

예제

class Book():
    def __init__(self, title, author, page):
        self.title = title
        self.author = author
        self.page = page
       
book = Book("Deeplearing", "architectyou", 20)
print(book)

원래 파이썬 객체를 print() 문을 이용해 출력하면 아래와 같이 객체라는 정보가 출력되죠.

파이썬 객체 출력시

 

그런데 __str__ 메서드를 사용하면 결과가 다릅니다.

class Book():
    def __init__(self, title, author, page):
        self.title = title
        self.author = author
        self.page = page
        
    def __str__(self) :
        return "이렇게 읽어줘요"

__str__ 메서드 추가시

 

다음과 같이 __str__ 안에 있는 값을 바로 출력해줍니다.

사용자 친화적으로 문자열 그대로를 출력하기 위해 사용 합니다.

 

그렇다면 repr과의 차이가 뭘까요?

 

 

 

__repr__ 메서드

  • 객체의 "공식적인" 문자열 표현을 제공합니다.
  • 따라서 객체를 재생성 할 수 있는 정보를 포함합니다.
  • 디버깅이나 개발 과정에서 객체의 상세 정보를 확인할 때 사용합니다.
  • 주로 개발자를 위한 출력에 사용합니다.

 

예제

아까의 클래스 안에 다음과 같이 메서드가 추가 됐다고 생각해 봅시다.

    def __repr__(self): 
        return f"Book(title='{self.title}', author='{self.author}', page={self.page})"
    
book = Book("Deeplearing", "architectyou", 20)
print(str(book))
print(repr(book))

repr_book = repr(book)

new_book = eval(repr_book)
print(new_book)

 

이를 출력해보면 아래와 같이 출력물이 나오는 것을 확인할 수 있습니다.

 

repr 출력물

 

print 문을 사용했을때 __str__ 메서드와 __repr__ 메서드 모두

클래스 객체의 문자열 출력을 해 준다는 것은 변함없지만,

형태가 갖춰졌을 때, repr의 경우 또 다른 객체를 생성하는 형식으로 재 사용이 가능합니다.

 

 

기본적인 "문자열" 자체를 출력한다는 변함이 없지만,

사용자가 어떻게 사용하느냐에 따라 다른 것 같습니다.

 

기본적으로 클래스 내에 __str__ 메서드와 __repr__ 메서드가 동시에 존재할 때,

print() 문을 이용하여 출력하고자 하면

클래스는 __str__을 기본적으로 먼저 출력하고, repr 로 지정할 경우 repr을 출력합니다.