웹사이트 검색

파이썬에서 __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() 함수는 <__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)

출력은 다음과 같습니다.

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

앞의 예제 코드는 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))

출력은 다음과 같습니다.

Output
The creature type is Jellyfish and the age is 5 Ocean('Jellyfish', 5)

이전 예제에서 __str__()의 구현은 사용자에게 개체의 관련 세부 정보를 제공하는 읽기 쉬운 문자열을 반환합니다. __repr__()의 구현은 개체를 재생성하는 데 사용할 수 있는 유효한 Python 표현식인 문자열을 반환합니다: Ocean(Jellyfish, 5). 이 예제에서는 문자열에 대해 f-문자열 형식을 사용하지만 Python에서 지원하는 모든 형식을 사용하여 문자열의 형식을 지정할 수 있습니다.

결론

이 문서에서는 __str__() 메서드와 __repr__() 메서드 간의 차이점을 살펴보고 이러한 특수 메서드를 클래스에 구현했습니다. 직접 전화하십시오. Python 문자열 자습서를 통해 Python에서 문자열 작업에 대해 자세히 알아보세요.