파이썬에서 __str__() 및 __repr__() 메서드를 사용하는 방법
소개
이 기사에서는 Python 데이터 모델에 정의된 특수 메서드 __str__()
및 __repr__()
에 대해 알아봅니다. __str__()
및 __repr__()
메서드는 객체에 대한 유용한 정보를 기록하거나 인쇄하여 Python 코드를 디버깅하는 데 도움이 될 수 있습니다.
Python 특수 메서드는 이중 밑줄로 시작하고 끝나며 비공식적으로 dunder 메서드라고 합니다. Dunder 메서드는 Python의 내장 연산자 및 함수의 기본 메서드입니다. dunder 메서드를 직접 호출하는 것을 피하고 대신 클래스에서 dunder 메서드를 구현한 다음 str()
및 repr()\
과 같이 이를 호출하는 내장 함수를 사용해야 합니다.
__str__()과 __repr__()의 차이점은 무엇입니까?
__str__()
메서드는 객체의 사람이 읽을 수 있거나 비공식적인 문자열 표현을 반환합니다. 이 메서드는 내장 print()
, str()
및 format()
함수에 의해 호출됩니다. 클래스에 대해 __str__()
메서드를 정의하지 않으면 내장 개체 구현이 대신 __repr__()
메서드를 호출합니다.
__repr__()
메서드는 객체의 더 많은 정보 또는 공식적인 문자열 표현을 반환합니다. 이 메서드는 내장 repr()
함수에 의해 호출됩니다. 가능한 경우 반환된 문자열은 객체를 다시 만드는 데 사용할 수 있는 유효한 Python 표현식이어야 합니다. 모든 경우에 문자열은 정보를 제공하고 모호하지 않아야 합니다.
일반적으로 __str__()
문자열은 사용자를 위한 것이고 __repr__()
문자열은 개발자를 위한 것입니다.
내장 클래스를 사용하는 __str__() 및 __repr__() 예제
이 섹션의 예제는 데모용으로 __str__()
및 __repr__()
메서드를 직접 호출합니다.
datetime.datetime
클래스는 __str__()
및 __repr__()
메서드의 기본 구현이 있는 내장 Python 클래스입니다.
다음 예제 코드는 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()
함수는 < code>__repr__() 객체를 재생성하는 데 사용할 수 있는 더 많은 정보가 포함된 문자열을 반환합니다. 실제로 eval()
함수와 함께 repr()
함수를 사용하여 문자열에서 새 객체를 생성할 수 있습니다.
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()
과 repr()
은 동일한 값을 반환합니다. __str__()
이 구현되지 않은 경우.
__str__()
및 __repr__()
메서드의 구현으로 Ocean 클래스를 업데이트합니다.
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(Jellyfish, 5)
. 이 예제에서는 문자열에 대해 f-문자열 형식을 사용하지만 Python에서 지원하는 모든 형식을 사용하여 문자열의 형식을 지정할 수 있습니다.
결론
이 문서에서는 __str__()
메서드와 __repr__()
메서드 간의 차이점을 살펴보고 이러한 특수 메서드를 클래스에 구현했습니다. 직접 전화하십시오. Python 문자열 자습서를 통해 Python에서 문자열 작업에 대해 자세히 알아보세요.