ABOUT ME

-

  • [python] 파이썬 __str__ 메서드에 대해
    코딩 연습/코딩배우기 2020. 9. 13. 13:26

     

    ■ 파이썬에서 어떤 값(또는 객체)을 문자열로 변환하는데 사용하는 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
    >>>

     

     

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

     

     

     

Designed by goodthings4me.