파이썬에서의 str vs repr : 설명
Published 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 스타일의 사용자 인터페이스로 변환합니다.
용어 정의 : __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__
메서드의 핵심 개념을 살펴보았습니다. 그러나 여전히 이러한 던더 메서드에 대한 질문이 있을 수 있습니다. 자주 묻는 질문에 대해 알아 보겠습니다.
-
Python 클래스에서
__str__
및__repr__
을 정의하지 않으면 어떻게 될까요?클래스에서
__str__
또는__repr__
을 정의하지 않으면 Python은 기본 구현을 사용합니다. 기본__str__
메서드는 클래스 이름과 메모리 주소가 포함된 문자열을 반환하고, 기본__repr__
은 동일합니다. -
클래스에서
__str__
및__repr__
메서드를 항상 구현해야 할까요?최소한
__repr__
을 구현하는 것이 좋습니다.__str__
이 정의되지 않은 경우 대신 비상용적으로 된__repr__
을 사용하기 때문입니다. 그러나 두 메서드를 모두 구현하는 것은 특정 요구 사항에 따라 다릅니다. 클래스 객체가 사용자 친화적인 문자열 표현을 가져야 하는 경우__str__
을 구현하는 것이 좋습니다. -
__str__
및__repr__
이 어떤 유형의 문자열을 반환할 수 있나요?__str__
및__repr__
이 기술적으로는 어떤 문자열이든 반환할 수 있지만 관례를 따르는 것이 좋습니다 :__str__
은 읽기 쉽고 간결해야 하며,__repr__
은 상세하게 완벽하게 명시하고 가능한 경우eval()
을 사용하여 객체를 재생산 할 수 있어야 합니다.