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>'
>>>
※ __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
>>>
[참고자료] 윤성우의 열혈파이썬 중급편
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
[python] 파이썬 __slots__의 효과 (0) | 2020.09.14 |
---|---|
[python] 파이썬의 정보은닉(Information Hiding)과 __dict__ 메서드에 대해 (0) | 2020.09.13 |
[python] 파이썬 __init__, __str__, __iter__, __next__ 등의 메서드 (0) | 2020.09.12 |
[python] 파이썬 파일 쓰기, 읽기 - open(), read(), readline(), readlines() (0) | 2020.09.11 |
[python] 파이썬 클래스 상속(inheritance) (0) | 2020.09.10 |
댓글