파이썬에서 __str__() 및 __repr__() 메서드를 사용하는 방법

소개

이 문서에서는 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)

출력은 다음과 같습니다:

Output
mydate1 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

앞선 예제 코드는 mydate1repr() 문자열에서 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))

결과는 다음과 같습니다:

Output
The 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