매직 메서드 - 문자열 표현
1. __str__
메서드
__str__
메서드는 객체를 사람이 읽기 쉬운 문자열로 표현할 때 사용하는 메서드입니다. str()
함수나 print()
함수를 호출할 때 자동으로 호출됩니다.
class Person:
def __str__(self):
return "사람입니다"
person = Person()
print(person)
2. __repr__
메서드
__repr__
메서드는 객체를 표현하는 공식적인 문자열을 반환합니다. 주로 디버깅이나 개발 중에 객체의 상태를 확인하는 데 사용됩니다. repr()
함수를 호출하거나, 대화형 콘솔에서 객체를 직접 참조할 때 호출됩니다.
class Person:
def __str__(self):
return "사람입니다"
def __repr__(self):
return "Person()"
person = Person()
print(person) # 비교해보세요. __str__이 호출됩니다.
print([person])
print(repr(person))
3. __str__
과 __repr__
의 차이점
- 용도의 차이
__str__
: 최종 사용자를 위한 읽기 쉬운 형태
__repr__
: 개발자를 위한 상세한 정보
- 호출 우선순위
__str__
이 정의되지 않은 경우, Python은 __repr__
을 대신 사용합니다.
class Person:
def __init__(self, name):
self.name = name
def __repr__(self):
return f"Person(name='{self.name}')"
person = Person("홍길동")
print(person) # __str__이 없어도 __repr__이 호출됨
4. 좋은 구현 방법
__repr__
은 가능하면 객체를 재생성할 수 있는 형태로 구현
__str__
은 사용자가 이해하기 쉬운 형태로 구현
__repr__
은 객체 안에 담겼을 경우 알아보기 쉬운 형태로 구현
class Number:
def __init__(self, value):
self.value = value
def __repr__(self):
return f"Number({self.value})"
def __str__(self):
return str(self.value)
num = Number(42)
print(f"str(): {num}") # 사용자 친화적
print(f"repr(): {repr(num)}") # 개발자 친화적
여기서 3번은 예를 들어 아래와 같이 리스트에 담겼을 때를 말합니다. 여기서 모든 문자열을 다 출력해주는 것은 비효율적이 될 수 있으므로 적절히 처리해주는 것이 좋습니다.
예를 들어 인스턴스 변수가 100개이고, 이 인스턴스 변수가 리스트 안에 1000개가 들어있다면 출력하는데 꽤나 시간이 걸리고, 출력 결과도 너무 길어질 수 있습니다. 만약 이러한 경우라면 아래 있는 인스턴스 변수 중 일부만 출력하는 것도 좋은 방법입니다.
class Book:
def __init__(self, title, authors, price):
self.title = title
self.authors = authors
self.price = 0
def __repr__(self):
return f"Book(title='{self.title}', authors={self.authors}, price={self.price})"
book = Book("파이썬 프로그래밍", ["licat", "mura"], 30000)
print(book) {"packages":["numpy","pandas","matplotlib","lxml"]}