본문 바로가기

매직 메서드 - 문자열 표현

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__의 차이점

  1. 용도의 차이
  • __str__: 최종 사용자를 위한 읽기 쉬운 형태
  • __repr__: 개발자를 위한 상세한 정보
  1. 호출 우선순위 __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. 좋은 구현 방법

  1. __repr__은 가능하면 객체를 재생성할 수 있는 형태로 구현
  2. __str__은 사용자가 이해하기 쉬운 형태로 구현
  3. __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)
매직 메서드 - 문자열 표현 - 파이썬 클래스 톺아보기 | 위니버시티