[python] 파이썬의 __repr__의 목적

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

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



답변

__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)


답변

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

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

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


답변

__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__기본적으로 호출 됩니다.


원하는 경우 설명서


답변

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


답변

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

>>> 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에 대한 인수로 의 반환 값을 호출하려고 하면 결과가 유효하지 않습니다.


답변

클래스를 정의하여 새 유형을 만들 때 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)


답변

구현 하는 모든 클래스에 대해 repr 을 구현하십시오. 변명이 없어야합니다. 가독성이 모호하지 않은 것이 더 중요하다고 생각되는 클래스에 대해 str 을 구현하십시오 .

이 링크를 참조하십시오 : https://www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python /