소개
이 문서에서는 Python 데이터 모델에 정의된 특수 메서드 __str__()
과 __repr__()
에 대해 배우게 됩니다. __str__()
과 __repr__()
메서드는 객체에 대한 유용한 정보를 기록하거나 출력하여 Python 코드의 디버깅을 도와줄 수 있습니다.로그에 유용한 정보를 출력하는 등의 방식으로 Python 코드를 디버깅하는 데 도움이 될 수 있습니다.
Python의 특수 메서드는 언더스코어 두 개로 시작하고 끝나며, 비공식적으로는 던더 메서드로 알려져 있습니다. 던더 메서드는 Python의 내장 연산자와 함수의 기본적인 메서드입니다. 직접 던더 메서드를 호출하는 것은 피하고, 대신 클래스에서 던더 메서드를 구현한 다음 str()
및 repr()
과 같은 내장 함수를 사용하여 이를 호출하는 것이 좋습니다.
__str__()
과 __repr__()
의 차이점은 무엇인가요?
__str__()
메서드는 객체의 사람이 읽기 쉽거나 비공식적인 문자열 표현을 반환합니다. 이 메서드는 내장 print()
, str()
, 그리고 format()
함수에 의해 호출됩니다. 클래스에 __str__()
메서드를 정의하지 않으면 내장된 객체 구현이 대신 __repr__()
메서드를 호출합니다.
__repr__()
메서드는 객체의 더 많은 정보가 담긴 공식적인 문자열 표현을 반환합니다. 이 메서드는 내장 repr()
함수에 의해 호출됩니다. 가능한 경우 반환된 문자열은 객체를 다시 생성하는 데 사용할 수 있는 유효한 Python 표현이어야 합니다. 모든 경우에 문자열은 정보를 제공하고 모호하지 않아야 합니다.
일반적으로, __str__()
문자열은 사용자를 위해, 그리고 __repr__()
문자열은 개발자를 위해 의도되어 있습니다.
__str__()
및 __repr__()
내장 클래스 사용 예제
이 섹션의 예제는 데모 목적으로 직접 __str__()
및 __repr__()
메서드를 호출합니다.
datetime.datetime
클래스는 내장된 Python 클래스로, 기본적으로 __str__()
및 __repr__()
메서드를 구현합니다.
다음 예제 코드는 datetime.datetime
객체에 대한 __str__()
및 __repr__()
메서드의 기본 구현에서 반환된 문자열을 보여줍니다:
import datetime
mydate = datetime.datetime.now()
print("__str__() string: ", mydate.__str__())
print("str() string: ", str(mydate))
print("__repr__() string: ", mydate.__repr__())
print("repr() string: ", repr(mydate))
출력은 다음과 같습니다:
Output__str__() string: 2023-01-27 09:50:37.429078
str() string: 2023-01-27 09:50:37.429078
__repr__() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)
repr() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)
출력에서 str()
함수는 __str__()
을 호출하고 사람이 읽을 수 있는 문자열을 반환하며, repr()
함수는 __repr__()
을 호출하고 객체를 재생성할 수 있는 더 많은 정보가 포함된 문자열을 반환합니다. 실제로 repr()
함수를 eval()
함수와 함께 사용하여 문자열에서 새 객체를 생성할 수 있습니다:
import datetime
mydate1 = datetime.datetime.now()
mydate2 = eval(repr(mydate1))
print("mydate1 repr() string: ", repr(mydate1))
print("mydate2 repr() string: ", repr(mydate2))
print("the values of the objects are equal: ", mydate1==mydate2)
출력은 다음과 같습니다:
Outputmydate1 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635)
mydate2 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635)
the values of the objects are equal: True
앞선 예제 코드는 mydate1
의 repr()
문자열에서 mydate2
객체를 생성하고, 그런 다음 두 객체의 값이 동일한지 확인합니다.
__str__()
및 __repr__()
을 사용하는 예제: 새로운 클래스
클래스를 만들 때는 적어도 내장 함수가 __repr__()
을 사용할 때 유용한 정보가 반환되도록 __repr__()
메서드를 구현해야 합니다.
다음 클래스는 __str__()
또는 __repr()__
메서드를 구현하지 않습니다:
class Ocean:
def __init__(self, sea_creature_name, sea_creature_age):
self.name = sea_creature_name
self.age = sea_creature_age
c = Ocean('Jellyfish', 5)
print(str(c))
print(repr(c))
str()
및 repr()
을 사용할 때의 출력은:
Output<__main__.Ocean object at 0x102892860>
<__main__.Ocean object at 0x102892860>
이전의 예제에서는 객체의 __repr()__
에 대한 기본 구현이 클래스와 객체 id
만을 16진수 형식으로 포함한 문자열을 반환함을 보여줍니다. 이는 그다지 유용하지 않습니다. str()
및 repr()
은 동일한 값을 반환하는데, 이는 __str__()
이 구현되지 않았을 때 str()
이 __repr__()
을 호출하기 때문입니다.
Ocean 클래스를 다음과 같이 __str__()
및 __repr__()
메서드를 구현하여 업데이트하십시오:
class Ocean:
def __init__(self, sea_creature_name, sea_creature_age):
self.name = sea_creature_name
self.age = sea_creature_age
def __str__(self):
return f'The creature type is {self.name} and the age is {self.age}'
def __repr__(self):
return f'Ocean(\'{self.name}\', {self.age})'
c = Ocean('Jellyfish', 5)
print(str(c))
print(repr(c))
결과는 다음과 같습니다:
OutputThe creature type is Jellyfish and the age is 5
Ocean('Jellyfish', 5)
이전 예제의 __str__()
구현은 사용자에게 객체의 관련 세부 정보를 제공하는 쉽게 읽을 수 있는 문자열을 반환합니다. __repr__()
의 구현은 객체를 재생성하는 데 사용할 수 있는 유효한 Python 표현을 반환합니다: Ocean('해파리', 5)
. 이 예제에서는 문자열에 대한 f-string 형식을 사용하지만 Python에서 지원하는 어떤 형식이든 사용하여 문자열을 포맷할 수 있습니다.
결론
이 기사에서는 __str__()
및 __repr__()
메서드 간의 차이를 탐구하고 클래스에서 이러한 특수 메서드를 구현하여 직접 호출할 필요가 없도록 했습니다. Python에서 문자열 작업에 대해 더 알아보려면 Python 문자열 튜토리얼을 참조하세요.
Source:
https://www.digitalocean.com/community/tutorials/python-str-repr-functions