logo

파이썬 특수 메서드 __str__과 __repr__ 차이 📂프로그래밍

파이썬 특수 메서드 __str__과 __repr__ 차이

설명

__str____repr__은 파이썬에서 객체의 문자열 표현을 정의하는 두 개의 특수 메서드이다. 이 두 메서드는 비슷한 역할을 하지만, 그 목적과 사용되는 상황이 다르다. 우선 __str__이라는 이름은 string에서 따왔고, 말 그대로 객체 혹은 객체의 값 그 자체를 문자열로 반환해준다고 보면 된다. 반면에 __repr__이라는 이름은 representation에서 따온 것으로, 객체를 표현하는 문자열을 반환해준다. 즉, __repr__은 객체를 재현할 수 있는 문자열을 반환하는 것이고, __str__은 사용자에게 필요한 보여주기 위한 문자열을 반환하는 것이다. 결국은 정의하는 사람이 어떻게 정의하느냐에 따라서 다르지만, 어떤 객체 obj에 대해서, eval(obj.__repr__())으로 obj를 다시 재현할 수 있도록 하는 것이 권장된다.

또한 REPL에서 obj를 입력했을 때 나오는 문자열이 __repr__의 결과물, print(obj)를 했을 때 나오는 문자열이 __str__의 결과물이라고 보면 된다. 이제 아래와 같이 날짜와 시간에 관한 정보를 dt라는 객체로 정의해보자.

import datetime

dt = datetime.datetime(2025, 5, 28, 16, 53, 45)

dt.__str__()는 이 객체가 담고 있는 정보인 2025년 5월 28일 16시 53분 45초라는 정보를 사용자가 보기에 편한 형태로 보여준다.

>>> dt.__str__()
'2025-05-28 16:53:45'

>>> str(dt)
'2025-05-28 16:53:45'

>>> print(dt)
2025-05-28 16:53:45

반면에 dt.__repr__()는 이 객체를 재현할 수 있는 문자열을 보여준다. 즉, eval(dt.__repr__())을 하면 dt와 같은 객체가 만들어진다.

>>> dt.__repr__()
'datetime.datetime(2025, 5, 28, 16, 53, 45)'

>>> repr(dt)
'datetime.datetime(2025, 5, 28, 16, 53, 45)'

>>> dt
datetime.datetime(2025, 5, 28, 16, 53, 45)

>>> eval(repr(dt)) == dt
True

다만 모든 파이썬 클래스에서 이것이 지켜지는 것은 아니라는 것에 주의하자. 가령 numpy.arraytorch.tensor와 같은 경우만 봐도 __repr__ 메서드가 해당 객체를 재현할 수 있도록하는 문자열 자체를 반환하지는 않는다.

환경

  • OS: Windows11
  • Version: Python 3.10.11