파이썬 특수 메서드 __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.array
나 torch.tensor
와 같은 경우만 봐도 __repr__
메서드가 해당 객체를 재현할 수 있도록하는 문자열 자체를 반환하지는 않는다.
환경
- OS: Windows11
- Version: Python 3.10.11