파이썬의 __repr__의 목적


139
def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

이 방법의 의미 / 목적은 무엇입니까?


@ zjm1126 : 왜 >>> variable어떤 __repr__()결과 가 인쇄되는지 알고 싶 습니까?
Esteban Küber

18
그 문서는 사람들을 잠들게합니다. 또한, 이것이 어떻게 사용되는지 다른 사람들로부터 배우는 것이 도움이됩니다.
Concerned_Citizen


2
Python을 배우는 Java 개발자의 경우 이것을 보는 가장 좋은 방법은 Java의 toString ()입니다.
Ravi

답변:


188

__repr__이 객체를 생성 할 수있는 방법 중 하나 인 객체의 인쇄 가능한 표현을 반환해야 합니다. 공식 문서를 참조 하십시오 . 최종 사용자를위한 __repr__반면 개발자를 __str__위한 것입니다.

간단한 예 :

>>> class Point:
...   def __init__(self, x, y):
...     self.x, self.y = x, y
...   def __repr__(self):
...     return 'Point(x=%s, y=%s)' % (self.x, self.y)
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)

2
lazy1 : 주로 서식을 수정하고 싶었습니다 (예제를 샘플 세션에서 볼 수있는 것과 최대한 가깝게 일치시키는 것이 유용합니다).하지만 출력 형식을 할당과 명시 적으로 다르게 조정했습니다. 이 문제에 대해 혼란스러워하는 사람의 명확성을 크게 향상시킵니다. (내가 멀리 가면 다시 편집하면 맥주를 빚을 것이다.)


1
아마도 % s 대신 % r을 사용해야합니다 : stackoverflow.com/questions/6005159/…
Jonathan Adelson

43
이것은 실제로 올바르지 않습니다. __str__는 사람이 읽을 수 있어야하는 출력입니다 __repr__. 파이썬 인터프리터가 읽을 수있는 표현이어야합니다 (즉, 문자열을 인터프리터에 공급하여 객체를 다시 작성해야 함). 그러나 객체에 __str__메소드 가없는 경우 __repr__대신 사용됩니다. 또한주의 :이 예는 실제로 인쇄 __str__의 방법 self.xself.y: %r대신 표기 %s문자열 포맷 동작 (정의하지 않는 클래스 때문에 __str__, __repr__실제로 어쨌든 반환하지만 예외적이다).
Daniel Andersson

20

이것은 파이썬 문서 에서 꽤 잘 설명되어 있습니다 .

repr ( object ) : 인쇄 가능한 객체 표현이 포함 된 문자열을 반환합니다. 이것은 변환에 의해 산출 된 값과 같습니다 (역 따옴표). 이 기능을 일반 기능으로 액세스 할 수있는 경우가 종종 있습니다. 많은 유형의 경우이 함수는에 전달 될 때 동일한 값을 가진 객체를 생성하는 문자열을 반환하려고 시도합니다 eval(). 그렇지 않으면 표현은 추가 정보와 함께 객체 유형의 이름을 포함하는 꺾쇠 괄호로 묶인 문자열입니다. 종종 객체의 이름과 주소를 포함합니다. 클래스는 __repr__()메소드 를 정의하여이 함수가 인스턴스에 대해 리턴하는 것을 제어 할 수 있습니다 .

여기서 보시는 것은의 기본 구현으로 __repr__, 직렬화 및 디버깅에 유용합니다.


5
객체의 "표현"을 얻는 역 따옴표 (또는 '백틱') 방법은 더 이상 사용되지 않으며 3.0 버전에서 제거되었습니다.
MatrixFrog

MatrixFrog : 둘 다 사실이지만 현재 2.x 설명서는 여전히 인용문의 출처입니다.

많은 객체에서 __repr__과 __str__은 동일한 기능입니다. 실제로 __str__ 만 정의하면 __repr__의 기본값은 __str__을 호출하는 것입니다. 이것이 사실이 아닌 가장 확실한 경우는 문자열 자체입니다 : str ( 'stackoverflow')는 반환 stackoverflow하지만 repr ( 'stackoverflow')은 'stackoverflow'입니다.
MatrixFrog

6
__repr__은 __str__을 사용하지 않지만 그 반대가 발생할 수 있습니다. docs.python.org/reference/…

13

__repr__독립형 Python 인터프리터에서 클래스를 인쇄 가능한 형식으로 표시하는 데 사용됩니다. 예:

~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
...     def __init__(self):
...         pass
...     def __repr__(self):
...         return '<StackOverflow demo object __repr__>'
... 
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>

__str__메소드가 클래스에 정의되지 않은 경우 __repr__인쇄 가능한 표현을 작성하기 위해 함수를 호출합니다 .

>>> str(demo)
'<StackOverflow demo object __repr__>'

또한 print()클래스를 호출하면 __str__기본적으로 호출 됩니다.


원하는 경우 설명서


7

__repr__의 방법은 단순히 클래스의 객체를 인쇄하는 방법을 파이썬을 알려줍니다


1

그들 사이의 차이점을 보는 예 ( 이 출처 에서 복사했습니다 ),

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'

의 반환 값 repr()str()동일 int x하지만, 반환 값 사이에는 차이가 있습니다. str y하나는 공식적인 것과 다른 하나는 비공식적 입니다. 공식 표현과 비공식 표현의 가장 중요한 차이점 중 하나는 __repr__str 값 에 대한 기본 구현 을 eval에 대한 인수로 호출 할 수 있으며 반환 값은 다음과 같은 유효한 문자열 객체라는 것입니다.

>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

__str__eval에 대한 인수로 의 반환 값을 호출하려고 하면 결과가 유효하지 않습니다.


1

클래스를 정의하여 새 유형을 만들 때 Python의 특정 기능을 활용하여 새 클래스를 편리하게 사용할 수 있습니다. 이러한 기능 중 하나는 "마법 방법"이라고도하는 "특수 방법"입니다.

특수 메소드에는 두 개의 밑줄로 시작하고 끝나는 이름이 있습니다. 우리는 그것들을 정의하지만 보통 이름으로 직접 부르지는 않습니다. 대신 특정 상황에서 자동으로 실행됩니다.

print 문을 사용하여 객체의 인스턴스 값을 출력하는 것이 편리합니다. 이 작업을 수행 할 때 값을 이해할 수있는 명확한 형식으로 출력에 표시하려고합니다. 에 repr 이 발생하는 특별한 방법은 준비하는 데 사용할 수 있습니다. 이 메소드를 정의하면이 메소드를 정의한 클래스의 인스턴스 값을 인쇄 할 때 자동으로 호출 될 수 있습니다. 그러나 유사하지만 동일하지 않은 목적으로 사용되는 str 특수 방법 도 있으며 , 정의 된 경우 우선 순위를 얻을 수도 있습니다.

Point3D 클래스에 대한 repr 메소드를 정의하지 않고 my_point를 Point3D의 인스턴스로 인스턴스화 한 다음이 작업을 수행합니다 ...

my_point를 출력 ... 우리는 이것을 출력으로 볼 수 있습니다 ...

별로 좋지 않습니까?

따라서 repr 또는 str 특수 메소드 또는 둘 다를 정의하여 출력을 향상시킵니다.

**class Point3D(object):
    def __init__(self,a,b,c):
        self.x = a
        self.y = b
        self.z = c
    def __repr__(self):
        return "Point3D(%d, %d, %d)" % (self.x, self.y, self.z)
    def __str__(self):
        return "(%d, %d, %d)" % (self.x, self.y, self.z)
my_point = Point3D(1, 2, 3)
print my_point # __repr__ gets called automatically
print my_point # __str__ gets called automatically**

출력 ...

(1, 2, 3) (1, 2, 3)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.