Python에서 __str__와 __repr__의 차이점
__str__
- 사용자 친화적:
str()
함수나print()
함수에서 자동으로 호출됩니다. - 간결한 표현: 객체의 주요 정보를 간결하게 표현합니다.
- 읽기 쉬움: 일반 사용자가 쉽게 이해할 수 있는 형식으로 표현됩니다.
__repr__
- 개발자 도구: 디버깅이나 로그 출력 등 개발 목적으로 사용됩니다.
- 명확한 정보: 객체의 클래스 이름, 속성, 메서드 등을 포함합니다.
예시
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"이름: {self.name}, 나이: {self.age}"
def __repr__(self):
return f"Person({self.name}, {self.age})"
person = Person("홍길동", 30)
print(person) # __str__ 호출: 이름: 홍길동, 나이: 30
print(repr(person)) # __repr__ 호출: Person('홍길동', 30)
결론
__str__
: 사용자에게 객체를 간결하고 읽기 쉽게 표현하기 위해 사용합니다.__repr__
: 개발자에게 객체의 상태를 정확하고 명확하게 표현하기 위해 사용합니다.
추가 정보
예제 코드: Person
클래스 정의 및 __str__
및 __repr__
메서드 구현
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"이름: {self.name}, 나이: {self.age}"
def __repr__(self):
return f"Person({self.name}, {self.age})"
person = Person("홍길동", 30)
print(person) # __str__ 호출: 이름: 홍길동, 나이: 30
print(repr(person)) # __repr__ 호출: Person('홍길동', 30)
Person
클래스는name
과age
속성을 가진 객체를 나타냅니다.__str__
메서드는 객체를 사용자에게 읽기 쉬운 형식으로 문자열 표현으로 반환합니다.
출력:
이름: 홍길동, 나이: 30
Person('홍길동', 30)
핵심 내용:
__str__
과__repr__
은 모두 Python 객체의 문자열 표현을 반환하는 특수 메서드입니다.__str__
은 사용자 친화적이고 간결한 표현을 제공하는 반면,__repr__
은 개발자 도구로서 정확하고 명확한 정보를 제공합니다.- 적절한 메서드를 사용하여 객체를 상황에 맞게 표현하는 것이 중요합니다.
__str__
및 __repr__
대체 방법
f-string
f-string을 사용하여 객체를 문자열 표현으로 변환할 수 있습니다. 이 방법은 간결하고 유연하며, __str__
메서드를 정의하는 것보다 더 간단할 수 있습니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def to_str(self):
return f"이름: {self.name}, 나이: {self.age}"
person = Person("홍길동", 30)
print(person) # f-string 호출: 이름: 홍길동, 나이: 30
format() 메서드
format()
메서드를 사용하여 객체를 문자열 표현으로 변환할 수 있습니다. 이 방법은 다양한 형식 문자열을 사용하여 객체 속성을 포맷하는 데 유용합니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def to_str(self):
return "이름: {}, 나이: {}".format(self.name, self.age)
person = Person("홍길동", 30)
print(person) # format() 호출: 이름: 홍길동, 나이: 30
객체 표현 사용자 정의
__str__
및 __repr__
메서드 대신 사용자 정의 표현 클래스를 사용할 수 있습니다. 이 방법은 더 많은 제어와 유연성을 제공하지만, 더 복잡하고 코드 양이 늘어날 수 있습니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person({self.name}, {self.age})"
def to_str(self):
return f"이름: {self.name}, 나이: {self.age}"
class PersonStr(str):
def __init__(self, person):
self.person = person
def __str__(self):
return to_str(self.person)
person = Person("홍길동", 30)
person_str = PersonStr(person)
print(person) # 객체 표현 사용자 정의 호출: 이름: 홍길동, 나이: 30
print(person_str) # 객체 표현 사용자 정의 호출: 이름: 홍길동, 나이: 30
선택 가이드
- 간결하고 가독성이 중요하다면: f-string 또는
format()
메서드를 사용하십시오. - 더 많은 제어와 유연성이 필요하다면:
__str__
및__repr__
메서드를 직접 정의하십시오. - 객체 표현에 대한 완벽한 제어가 필요하다면: 객체 표현 사용자 정의 클래스를 사용하십시오.
주의 사항:
- 선택한 방법에 관계없이 객체의 문자열 표현이 명확하고 이해하기 쉬운지 확인하십시오.
- 일관성을 위해 동일한 클래스 내에서
__str__
및__repr__
메서드를 함께 사용하거나 하나만 사용하십시오.
결론
python magic-methods repr