본문 바로가기
코딩 연습/코딩배우기

[python] 파이썬 __str__ 메서드에 대해

by good4me 2020. 9. 13.

goodthings4me.tistory.com

 

■ 파이썬에서 어떤 값(또는 객체)을 문자열로 변환하는데 사용하는 str()은 내장 함수가 아닌 파이썬 내장 클래스이며, 객체를 만들고 그 객체의 정보(클래스 이름, 저장 위치 등)를 알고싶을 때 print(객체이름)를 사용하는데, 이는 object 클래스의 __str__ 메서드가 호출되어 반환된 문자열 정보이다.

>>> str
<class 'str'>
>>>
>>> t = (1, 2, 3)
>>> str(t)
'(1, 2, 3)'
>>> t.__str__()  # == str(t)
'(1, 2, 3)'
>>>
>>>
>>> class Simple:
...     def __init__(self):
...         pass
...
>>> s = Simple()
>>>
>>> print(s)
<__main__.Simple object at 0x000002AFCE072D68>
>>>
>>> s.__str__()  # str(s)와 같음
'<__main__.Simple object at 0x000002AFCE072D68>'
>>>

 

 

■ 이러한 __str__의 문자열 반환 기능을 오버라이딩하여 쓸수 있다.(필요한 경우에 사용하면 좋음)

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def __str__(self):
        return '{0}: {1}'.format(self.name, self.age)


def main():
    p = Person('James', 23)
    print(p)  # James: 23  --> __str__ 호출


main()

 

class InfoID:
    def __init__(self):
        pass
        
    def __str__(self):
        return "생성된 객체 id() : " + str(id(self))


def main():
    a = InfoID()
    print(a)  # 생성된 객체 id() : 2185199773232  --> __str__ 호출


main()

 

※ __str__이 print로 출력하는 일반 문자열을 표기하는 방식인 반면, __repr__은 객체 생성 방법을 알 수 있도록 하는 표준 문자열 표기 방식이라고 하는데, __str__, __repr__ 모두 파이썬 객체(파이썬의 모든 것)에 대해 문자열로 표현(반환)하는 것은 같다.

>>> class Simple:
...     def __init__(self):
...         pass
...
>>> s = Simple()
>>>
>>> print(s)
<__main__.Simple object at 0x000002AFCE072D68>
>>>
>>> s.__str__()
'<__main__.Simple object at 0x000002AFCE072D68>'
>>>
>>> s.__repr__()
'<__main__.Simple object at 0x000002AFCE072D68>'
>>>

 

Ad

 

※ __str__ 과  __repr__ 의 차이점

>>> class Info_id:
...     def __str__(self):
...         return "id() : " + str(id(self))
...
>>> class Info_id:
...     def __str__(self):
...         return "id() : " + str(id(self))
...     def __repr__(self):
...         return "나는 Info_id 클래스입니다."
...
>>> Info_id
<class '__main__.Info_id'>
>>> print(Info_id)
<class '__main__.Info_id'>
>>>
>>> i = Info_id()
>>> i   <------------------------ __repr__ 호출
나는 Info_id 클래스입니다.
>>> print(i)  <------------------ __str__ 호출
id() : 1873072891272
>>>
>>> Info_id()  <----------------- __repr__ 호출
나는 Info_id 클래스입니다.
>>> print(Info_id())  <---------- __str__ 호출
id() : 1873072931504
>>>

 

 

[참고자료] 윤성우의 열혈파이썬 중급편

 

 

 

댓글