Skip to content

파이썬에서의 str vs repr : 설명

Updated on

파이썬 프로그래밍의 영역에서, __str____repr__는 던더 (double underscore) 메소드(매직 메소드 또는 스페셜 메소드라고도 함)입니다. 이것들은 파이썬에서 객체지향 프로그래밍의 중추 역할을 합니다. 이 종합적인 가이드는 이 두 메소드의 독창적인 기능, 파이썬에서의 중요성 및 적절한 적용 방법에 대하여 논할 것입니다. 추가적으로, 이 가이드는 기본 개념을 확립하기 위한 여러 선언문을 제시할 것입니다.

No code, quick pandas Dataframe Data Visualization을 빠르게 만들어 보시겠어요?

PyGWalker는 Visualization(시각화)하는 Python 라이브러리입니다. PyGWalker (opens in a new tab)는 귀찮은 Jupyter Notebook 내의 데이터 분석 및 데이터 시각화 작업을 단순화하여 pandas dataframe (및 polars dataframe)을 Tableau 스타일의 사용자 인터페이스로 변환합니다.

PyGWalker for Data visualization (opens in a new tab)

용어 정의 : __str__ vs __repr__

깊게 파보기 전에 먼저 이 두 중요한 메소드를 정의해 봅시다.

__str__ 메소드

파이썬에서 __str__은 객체의 "비공식적" 또는 잘 인쇄 가능한 문자열 표현을 계산하는 데 사용되는 메소드입니다. 그것은 사람이 읽고 이해하기 쉬운 결과를 제공하는 것을 목표로 하고 있습니다. 따라서, 이 메소드를 구현할 때 인식 가능성은 주요 고려 사항입니다.

아래에 쉬운 예를 살펴보겠습니다 :

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def __str__(self):
        return f'{self.name}{self.age}살이다.'
 
john = Person('John Doe', 30)
print(str(john))  # 출력: John Doe는 30살이다.

__repr__ 메소드

반면에 __repr__은 객체의 "공식적인" 문자열 표현을 계산하기 위해 사용되는 메서드입니다. 그 목적은 eval() 함수에 입력하여 객체를 재생성하기 위한 상세한 표현을 제공하는 것입니다. 따라서 이것은 객체를 디버깅하거나 로깅하기 위해 특히 유용합니다.

동일한 Person 클래스를 고려해보면, __repr__ 메소드가 포함된 경우 :

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def __repr__(self):
        return f'Person(name={self.name}, age={self.age})'
```python
john = Person('John Doe', 30)
print(repr(john))  # 출력: Person(name=John Doe, age=30)

__str____repr__의 사용 시점

이 메서드들에 대한 기본적인 이해가 있으니, 각각을 언제 사용하는지 살펴보겠습니다.

사용자 친화적 문자열 표현을 위한 __str__ 구현

__str__ 메서드는 주로 최종 사용자를 대상으로 합니다. 자세한, 더 읽기 쉬운 오브젝트의 비형식적인 설명을 제공합니다. 이것은, 사실적으로 프로그래머가 아닌 사용자들에게 이상적인 방식으로 오브젝트를 표시하는 방법이라고 생각할 수 있습니다.

당신의 파이썬 클래스에서 이 메서드를 구현할 때, 최종 사용자에게 가장 관련되고 유익한 정보를 제공하는 데 중점을 둡니다.

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price
 
    def __str__(self):
        return f'{self.name}은(는) {self.price} 달러입니다.'
 
iPhone = Product('iPhone', 999)
print(str(iPhone))  # 출력: iPhone은(는) 999 달러입니다.

위의 예제에서는 __str__ 메서드가 Product 오브젝트의 간단하고 인간이 읽을 수 있는 기술적인 설명을 제공합니다. str(iPhone)의 출력은 웹 사이트나 앱의 사용자에게 직접 표시될 수 있습니다.

디버깅과 개발을 위한 __repr__ 구현

대조적으로, __repr__ 메서드는 주로 개발자를 위해 설계되었습니다. 오브젝트의 완전하고 명확한 표현을 제공하며, 디버깅과 로깅에서 매우 유용합니다.

__repr__ 메서드를 구현할 때의 황금 규칙은, 가능하다면, 해당 오브젝트를 eval() 함수를 사용하여 재생성할 수 있는 문자열을 반환해야 한다는 것입니다. 이것은 복잡한 오브젝트의 경우 항상 가능한 것은 아니지만, 따르면 좋은 지침입니다.

__repr__ 메서드가 있는 Product 클래스를 살펴보세요.

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price
 
    def __repr__(self):
        return f'Product(name={self.name}, price={self.price})'
 
iPhone = Product('iPhone', 999)
print(repr(iPhone))  # 출력: Product(name=iPhone, price=999)

__repr__ 메서드의 출력은 __str__ 메서드와 비교해 상세하고 기술적입니다. 이 수준의 상세 정보는 효과적인 디버깅이나 로깅에 필요한 내용입니다.

파이썬 클래스에 대한 __str____repr__ 맞춤 설정

이제 각 메서드의 주요 사용 사례를 이해했으므로, 어떻게 구현해야 할지에 대해 이야기해 보겠습니다. 대체로 클래스 내에서 두 메서드를 모두 정의하고자 할 경우가 많겠지만, 이들의 구현은 기존 사용 사례에 많이 의존합니다.

사용자 정의 비형식적인 문자열 표현을 위한 __str__ 설정

__str__ 메서드를 정의할 때는 객체와 상호 작용하는 사람들과 그들이 알아야 할 내용을 생각하십시오. 메서드는 객체의 간결하고 인간이 읽을 수 있는 요약을 반환해야 합니다.

영화 예약 응용 프로그램에서 Movie 클래스가 있다고 가정해 봅시다.

class Movie:
    def __init__(self, title, director, rating):
        self.title = title
        self.director = director
        self.rating = rating
 
    def __str__(self):
        return f'{self.title} by {self.director}, rated {self.rating}/10.'
 
inception = Movie('Inception', 'Christopher Nolan', 8.8)
print(str(inception))  # 결과: Inception by Christopher Nolan, rated 8.8/10.

자세한 객체 설명을 위한 __repr__ 만들기

__repr__ 메서드를 구현할 때는 코드를 디버그하거나 객체의 상태를 기록하는 데 유용한 정보가 무엇인지 고려하십시오. 문자열은 객체를 한 눈에 이해할 수 있는 모든 정보를 포함해야 합니다.

Movie 클래스를 이어서 사용하는 경우, __repr__ 메서드는 다음과 같을 수 있습니다.

class Movie:
    def __init__(self, title, director, rating):
        self.title = title
        self.director = director
        self.rating = rating
 
    def __repr__(self):
        return f'Movie(title={self.title}, director={self.director}, rating={self.rating})'
 
inception = Movie('Inception', 'Christopher Nolan', 8.8)
print(repr(inception))  # 결과: Movie(title=Inception, director=Christopher Nolan, rating=8.8)

FAQs: Python의 __str____repr__ 이해하기

이제 Python의 __str____repr__ 메서드의 핵심 개념을 살펴보았습니다. 그러나 여전히 이러한 던더 메서드에 대한 질문이 있을 수 있습니다. 자주 묻는 질문에 대해 알아 보겠습니다.

  1. Python 클래스에서 __str____repr__을 정의하지 않으면 어떻게 될까요?

    클래스에서 __str__ 또는 __repr__을 정의하지 않으면 Python은 기본 구현을 사용합니다. 기본 __str__ 메서드는 클래스 이름과 메모리 주소가 포함된 문자열을 반환하고, 기본 __repr__은 동일합니다.

  2. 클래스에서 __str____repr__ 메서드를 항상 구현해야 할까요?

    최소한 __repr__을 구현하는 것이 좋습니다. __str__이 정의되지 않은 경우 대신 비상용적으로 된 __repr__을 사용하기 때문입니다. 그러나 두 메서드를 모두 구현하는 것은 특정 요구 사항에 따라 다릅니다. 클래스 객체가 사용자 친화적인 문자열 표현을 가져야 하는 경우 __str__을 구현하는 것이 좋습니다.

  3. __str____repr__이 어떤 유형의 문자열을 반환할 수 있나요?

    __str____repr__이 기술적으로는 어떤 문자열이든 반환할 수 있지만 관례를 따르는 것이 좋습니다 : __str__은 읽기 쉽고 간결해야 하며, __repr__은 상세하게 완벽하게 명시하고 가능한 경우 eval()을 사용하여 객체를 재생산 할 수 있어야 합니다.