0. Introduction

  • class에 대해 공부를 더 시작하면서 매직 메소드에 대해 알기 시작했다.
  • 매직 메소드의 종류인 __str____repr__ 에 대해 각각 알아보고, 차이점도 알아보자.

 


1. Magic method 의 종류: str 과 repr

python에서 이미 만들어놓은 내장된 method로, special method라 한다.

magic method의 종류 중 __str____repr__에 대해 알아보겠다.

  • __repr__ 의 repr은 representation의 약어다.

예시코드는 Python basic 24에서 작성한 코드를 이어서 사용한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
> class Airline():
>     def __init__(self, company, details):
>         self._company = company
>         self._details = details

> Airline1 = Airline('Koreanair', {'uniform_color': 'skyblue', 'kind':'FSC', 'price': 8000})
> Airline2 = Airline('Asiana', {'uniform_color': 'gray', 'kind':'FSC', 'price': 6000})
> Airline3 = Airline('t-wau', {'uniform_color': 'red', 'kind':'LCC', 'price': 3000})

> print(Airline1)
> print(Airline2)
> print(Airline3)
<__main__.Airline object at 0x000002DFDFF06FD0>
<__main__.Airline object at 0x000002DFDFF06F70>
<__main__.Airline object at 0x000002DFDFF06400>

Airline 클래스의 인스턴스를 보이기 위해서, print()을 사용하면 출력할 instance의 memory address를 보인다.

 

1.1 __str__ magic method

그러면 Airline class 내부에 __str__ instance method를 추가해보자.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
> class Airline():
>     def __init__(self, company, details):
>         self._company = company
>         self._details = details
>
>     def __str__(self):
>         return 'str : {} - {}'.format(self._company, self._details)

# instance 코드 부분은 생략한다.
> print(Airline1)
str : Koreanair - {'uniform_color': 'skyblue', 'kind': 'FSC', 'price': 8000}

> print(Airline2)
str : Asiana - {'uniform_color': 'gray', 'kind': 'FSC', 'price': 6000}

> print(Airline3)
str : t-wau - {'uniform_color': 'red', 'kind': 'LCC', 'price': 3000}

__str__ method 를 사용하니, memory address를 출력하는 것이 아닌, __str__ method의 return 값을 출력한다.

 

1.2 __repr__ magic method

다음으로 __repr__ method를 사용해보자.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
> class Airline():
>     def __init__(self, company, details):
>         self._company = company
>         self._details = details
>
>     def __repr__(self):
>         return 'repr : {} - {}'.format(self._company, self._details)

# instance 코드 부분은 생략한다.

> print(Airline1)
> print(Airline2)
> print(Airline3)
repr : Koreanair - {'uniform_color': 'skyblue', 'kind': 'FSC', 'price': 8000}
repr : Asiana - {'uniform_color': 'gray', 'kind': 'FSC', 'price': 6000}
repr : t-wau - {'uniform_color': 'red', 'kind': 'LCC', 'price': 3000}

__repr__ method 를 사용하니, memory address를 출력하는 것이 아닌, __repr__ method에서 return 값을 출력한다. 그러면 __str____repr__ 를 같이 사용해보자. __str__ method의 return 문을 출력했다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
> class Airline():
>     def __init__(self, company, details):
>         self._company = company
>         self._details = details
>
>     def __str__(self):
>         return 'str : {} - {}'.format(self._company, self._details)
>
>     def __repr__(self):
>         return 'repr : {} - {}'.format(self._company, self._details)

# instance 코드 부분은 생략한다.

> print(Airline1)
> print(Airline2)
> print(Airline3)
str : Koreanair - {'uniform_color': 'skyblue', 'kind': 'FSC', 'price': 8000}
str : Asiana - {'uniform_color': 'gray', 'kind': 'FSC', 'price': 6000}
str : t-wau - {'uniform_color': 'red', 'kind': 'LCC', 'price': 3000}

 

1.3. __str__ 과 __repr__ 의 공통점과 차이

그러면 여태까지의 증명으로 다음과 같은 사실을 알 수 있다.

  • __str__ 과 __repr__ 의 공통점

    • __str____repr__ 은 클래스의 인스턴스에 대한 memory address를 출력하는 게 아닌, 사용자가 원하는 출력문 즉, 이 magic method에서 반환한 형식으로 출력한다.
      • To customize the string representation of a class instance, the class needs to implement the __str__ magic method. [출처: python tutorial: __str__]
    • __str____repr__ 이 같이 사용되면 __str__이 출력된다.
  • __str__ 과 __repr__ 의 차이점 from Python __repr__

Magic method__str____repr__
대상사람이 읽기 쉬운 결과물기계(interpreter)가 읽기 쉬운 결과물
목적간결히 읽기 위함문자열로 객체를 다시 생성하기 위함
Informal / OfficalInformal string presentationOffical string presentation
1
2
3
4
5
6
7
> a = datetime.datetime(2022,3,13)

> print(str(a))
2022-03-13 00:00:00

> print(repr(a))
datetime.datetime(2022, 3, 13, 0, 0)

 


2. print ()와 __str__ method의 관계

print( )는 object.__str__를 통해서 문자열로 반환된 걸 출력하는 function

str(object)를 통해 문자열로 변환할 때, object.__str__를 호출하여 이 메소드를 통해 변환된 것을 반환한다. print()str()에게 출력할 arguments를 전달하여 문자열로 변환 후 출력한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
> class Airline():
>     def __init__(self, company, details):
>         self._company = company
>         self._details = details
>
>     def __str__(self):
>         return 'str : {} - {}'.format(self._company, self._details)

> print(str(Airline1))
str : Koreanair - {'uniform_color': 'skyblue', 'kind': 'FSC', 'price': 8000}

 

repr() 또한 __repr__을 통해서 변환된 것을 반환한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
> class Airline():
>     def __init__(self, company, details):
>         self._company = company
>         self._details = details
>
>     def __repr__(self):
>         return 'repr : {} - {}'.format(self._company, self._details)

# instance 코드 부분은 생략한다.

> print(repr(Airline1))
repr : t-wau - {'uniform_color': 'red', 'kind': 'LCC', 'price': 3000}

> print(str(Airline1))
repr : t-wau - {'uniform_color': 'red', 'kind': 'LCC', 'price': 3000}

__str__이 별도로 정의되지 않았고 __repr__만 정의된 상황일지라도, str()을 실행하면 __repr__가 실행된다.

 

Summary

  • print() –(호출)–> str(object) –(호출)–> object.__str__ –(호출)–> object.__repr__

    • print()object.__str__를 통해 변환된 걸 출력한다.
    • __str__은 내부적으로 default로 __repr__을 호출한다.
  • repr(object) –(호출)–> object.__repr__

    • object.__repr__ 를 통해 변환된 걸 반환한다.

 


Reference