문제

차이점은 무엇입니까? __str__ 그리고 __repr__ 파이썬에서?

도움이 되었습니까?

해결책

알렉스 잘 요약되었지만 놀랍게도 너무 간결했습니다.

먼저, 주요 요점을 반복하겠습니다 알렉스의 게시물:

  • 기본 구현은 쓸모가 없습니다 (그렇지 않은 것을 생각하기는 어렵지만 그렇습니다)
  • __repr__ 목표는 모호하지 않습니다
  • __str__ 목표는 읽을 수있는 것입니다
  • 컨테이너 __str__ 포함 된 개체를 사용합니다. __repr__

기본 구현은 쓸모가 없습니다

파이썬의 기본값이 상당히 유용한 경향이 있기 때문에 이것은 대부분 놀랍습니다. 그러나이 경우 기본값이있는 경우 __repr__ 다음과 같이 행동 할 것입니다.

return "%s(%r)" % (self.__class__, self.__dict__)

너무 위험했을 것입니다 (예 : 물체가 서로를 참조하면 무한 재귀에 들어가기가 너무 쉽습니다). 그래서 파이썬은 경찰이 나옵니다. 사실이 하나의 기본값이 있습니다. __repr__ 정의되고 __str__ 대상은 마치 마치 행동 할 것입니다 __str__=__repr__.

이것은 간단한 용어로 : 당신이 구현하는 거의 모든 객체는 기능적이어야합니다. __repr__ 그것은 대상을 이해하기 위해 사용할 수 있습니다. 구현 __str__ 선택 사항 : "예쁜 인쇄"기능이 필요한 경우 (예 : 보고서 생성기에서 사용) 수행하십시오.

의 목표 __repr__ 모호하지 않습니다

내가 바로 나와서 말하겠습니다 - 나는 디버거를 믿지 않습니다. 나는 디버거를 사용하는 방법을 정말로 모르고 진지하게 사용한 적이 없습니다. 게다가, 나는 디버거의 큰 결함이 그들의 기본 특성이라고 생각합니다. 오랫동안 오랫동안 디버그 한 실패는 멀리 떨어진 은하에서 일어난 일입니다. 이것은 종교적 열정으로 벌목을 믿는다는 것을 의미합니다. 로깅은 괜찮은 Fire and-Forget 서버 시스템의 생명체입니다. Python은 로그를 쉽게 기록 할 수 있습니다. 일부 프로젝트 별 포장지가 있으면 필요한 것은 필요합니다.

log(INFO, "I am in the weird function and a is", a, "and b is", b, "but I got a null C — using default", default_c)

그러나 마지막 단계를 수행해야합니다. 구현 한 모든 객체에 유용한 repr이 있는지 확인하십시오. 따라서 코드와 같은 코드는 작동 할 수 있습니다. 이것이“평가”가 등장하는 이유입니다. 정보가 충분하면 eval(repr(c))==c, 그것은 당신이 알아야 할 모든 것을 알고 있다는 것을 의미합니다. c. 적어도 퍼지 방식으로 충분히 쉽다면 그렇게하십시오. 그렇지 않은 경우 정보에 대해 충분한 정보가 있는지 확인하십시오. c 그래도. 나는 보통 평가와 같은 형식을 사용합니다. "MyClass(this=%r,that=%r)" % (self.this,self.that). 그것은 실제로 MyClass를 구성 할 수 있거나 이것이 올바른 생성자 인수라는 것을 의미하지는 않지만“이것은이 인스턴스에 대해 알아야 할 모든 것”을 표현하는 데 유용한 형태입니다.

참고 : 사용했습니다 %r 위의 것이 아닙니다 %s. 당신은 항상 사용하고 싶어합니다 repr() 또는 %r 내부에 동등하게 문자를 형식화합니다 __repr__ 구현, 또는 당신은 repr의 목표를 물리 치고 있습니다. 당신은 차별화 할 수 있기를 원합니다 MyClass(3) 그리고 MyClass("3").

의 목표 __str__ 읽을 수 있어야합니다

구체적으로, 그것은 명백한 것이 아닙니다. str(3)==str("3"). 마찬가지로, IP 추상화를 구현하면 STR이 192.168.1.1처럼 보이는 것은 괜찮습니다. 날짜/시간 추상화를 구현할 때 STR은 "2010/4/12 15:35:22"등이 될 수 있습니다. 목표는 프로그래머가 아닌 사용자가 읽고 싶어하는 방식으로이를 표현하는 것입니다. 쓸모없는 숫자를 차단하고 다른 클래스 인 척합니다. 가독성을 지원하는 한 개선입니다.

컨테이너 __str__ 포함 된 개체를 사용합니다. __repr__

이것은 놀랍지 않은 것 같습니다. 조금이지만 얼마나 읽을 수 있는지

[moshe is, 3, hello
world, this is a list, oh I don't know, containing just 4 elements]

이다? 하지 매우. 구체적으로, 컨테이너의 문자열은 문자열 표현을 방해하기가 너무 쉽다는 것을 알게 될 것입니다. 모호함에 직면하여, 파이썬은 추측하려는 유혹에 저항한다는 것을 기억하십시오. 목록을 인쇄 할 때 위의 동작을 원한다면

print "[" + ", ".join(l) + "]"

(아마도 사전에 대해 무엇을 해야하는지 알아낼 수도 있습니다.

요약

구현하다 __repr__ 당신이 구현하는 모든 클래스의 경우. 이것은 두 번째 특성이어야합니다. 구현하다 __str__ 가독성 측면에 잘못된 문자열 버전을 갖는 것이 유용하다고 생각되면.

다른 팁

내 경험 법칙 : __repr__ 개발자를위한 것입니다. __str__ 고객을위한 것입니다.

당신이 구체적으로 달리 보장하기 위해 행동하지 않는 한, 대부분의 클래스는 다음 중 하나에 도움이되는 결과가 없습니다.

>>> class Sic(object): pass
... 
>>> print str(Sic())
<__main__.Sic object at 0x8b7d0>
>>> print repr(Sic())
<__main__.Sic object at 0x8b7d0>
>>> 

보시다시피 - 차이가없고 클래스와 물체를 넘어서는 정보가 없습니다. id. 둘 중 하나만 무시한 경우 ... :

>>> class Sic(object): 
...   def __repr__(object): return 'foo'
... 
>>> print str(Sic())
foo
>>> print repr(Sic())
foo
>>> class Sic(object):
...   def __str__(object): return 'foo'
... 
>>> print str(Sic())
foo
>>> print repr(Sic())
<__main__.Sic object at 0x2617f0>
>>> 

보시다시피, 당신이 재정의한다면 __repr__, 그것은 또한 사용됩니다 __str__, 그러나 그 반대는 아닙니다.

알아야 할 다른 중요한 멍청이 : __str__ 내장 컨테이너에서 __repr__, __str__, 포함 된 항목의 경우. 그리고 전형적인 문서에서 발견 된 주제에 대한 단어에도 불구하고 __repr__ 객체의 문자열입니다 eval 동일한 객체를 구축하는 데 사용할 수 있습니다 (너무 어렵고 관련 모듈이 실제로 가져온 방법을 모르면 실제로 평평하게 불가능합니다).

그래서, 나의 조언 : 만들기에 집중하십시오 __str__ 합리적으로 인간이 읽을 수 있고 __repr__ 불쾌한 목표를 방해하더라도 가능한 한 모호하지 않습니다. __repr__입력으로 허용되는 가치가 반환되었습니다 __eval__!

__repr__: Python 객체의 표현은 일반적으로 eval이 해당 객체로 다시 변환합니다.

__str__: 당신이 생각하는 것은 텍스트 형식의 객체입니다.

예를 들어

>>> s="""w'o"w"""
>>> repr(s)
'\'w\\\'o"w\''
>>> str(s)
'w\'o"w'
>>> eval(str(s))==s
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    w'o"w
       ^
SyntaxError: EOL while scanning single-quoted string
>>> eval(repr(s))==s
True

요컨대, 목표 __repr__ 모호하지 않은 것입니다 __str__ 읽을 수 있어야합니다.

좋은 예는 다음과 같습니다.

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2012-03-14 09:21:58.130922'
>>> repr(today)
'datetime.datetime(2012, 3, 14, 9, 21, 58, 130922)'

이 문서를 Repr :

repr(object)

인쇄 가능한 객체 표현이 포함 된 문자열을 반환합니다. 이것은 변환에 의해 산출 된 것과 동일한 값입니다 (역수). 이 작업에 일반적인 기능으로 액세스 할 수있는 것이 유용합니다. 여러 유형의 경우이 기능은 전달 될 때 동일한 값의 객체를 생성하는 문자열을 반환하려고 시도합니다. eval(), 그렇지 않으면 표현은 객체의 이름과 주소를 포함한 추가 정보와 함께 개체 유형의 이름을 포함하는 각도 브래킷으로 둘러싸인 문자열입니다. 클래스는이 기능이 __repr__() 방법.

STR에 대한 문서는 다음과 같습니다.

str(object='')

객체를 잘 인쇄 할 수있는 표현을 포함하는 문자열을 반환합니다. 문자열의 경우, 이것은 문자열 자체를 반환합니다. 차이 repr(object) 그게 다 str(object) 항상 허용되는 문자열을 반환하려고 시도하지는 않습니다. eval(); 목표는 인쇄 가능한 문자열을 반환하는 것입니다. 인수가 없으면 빈 문자열을 반환하고 ''.

차이점은 무엇입니까? __str__ 그리고 __repr__ 파이썬에서?

__str__ ( "Dunder (Double-Onderscore) 문자열"으로 읽음) 및 __repr__ ( "Dunder-Repper"( "표현"의 경우)로 읽음)는 객체의 상태를 기반으로 문자열을 반환하는 특수한 방법입니다.

__repr__ 백업 동작을 제공합니다 __str__ 누락.

그래서 먼저 a __repr__ 이를 통해 사용하는 문자열에서 동등한 객체를 다시 정리할 수 있습니다. eval 또는 파이썬 쉘에서 문자로 문자로 입력함으로써.

나중에 언제든지 쓸 수 있습니다 __str__ 인스턴스의 사용자가 읽을 수있는 문자열 표현의 경우, 필요하다고 생각할 때.

__str__

물체를 인쇄하거나 전달하는 경우 format, str.format, 또는 str, 그렇다면 a __str__ 메소드가 정의되면 해당 메소드가 호출됩니다. 그렇지 않으면 __repr__ 사용하게 될 것이다.

__repr__

그만큼 __repr__ 메소드는 내장 기능에 의해 호출됩니다 repr 그리고 객체를 반환하는 표현식을 평가할 때 파이썬 쉘에 반향되는 것입니다.

백업을 제공하기 때문입니다 __str__, 당신이 하나만 쓸 수 있다면, __repr__

다음은 내장 된 도움이 있습니다 repr:

repr(...)
    repr(object) -> string

    Return the canonical string representation of the object.
    For most object types, eval(repr(object)) == object.

즉, 대부분의 물체의 경우 인쇄 된 내용을 입력하면 repr, 동등한 객체를 만들 수 있어야합니다. 그러나 이것은 기본 구현이 아닙니다.

기본 구현 __repr__

기본 객체 __repr__ 이다 (C 파이썬 소스)

def __repr__(self):
    return '<{0}.{1} object at {2}>'.format(
      self.__module__, type(self).__name__, hex(id(self)))

즉, 기본적으로 객체의 모듈, 클래스 이름 및 메모리 위치의 16 진수 표현을 예를 들어 다음과 같습니다.

<__main__.Foo object at 0x7f80665abdd0>

이 정보는 그다지 유용하지 않지만 주어진 인스턴스의 표준 표현을 정확하게 만들 수있는 방법을 도출 할 수있는 방법은 없으며, 아무것도 아닌 것보다 낫습니다.

어떻게 __repr__ 유용한?

파이썬 쉘을 사용하여 얼마나 유용 할 수 있는지 살펴보고 datetime 사물. 먼저 가져와야합니다 datetime 기준 치수:

import datetime

우리가 전화하면 datetime.now 쉘에서는 동등한 DateTime 객체를 재현하는 데 필요한 모든 것을 볼 수 있습니다. 이것은 dateTime에 의해 만들어집니다 __repr__:

>>> datetime.datetime.now()
datetime.datetime(2015, 1, 24, 20, 5, 36, 491180)

DateTime 객체를 인쇄하면 멋진 인간 읽기 가능 (실제로 ISO) 형식이 보입니다. 이것은 DateTime에 의해 구현됩니다 __str__:

>>> print(datetime.datetime.now())
2015-01-24 20:05:44.977951

우리가 잃어버린 객체를 재현하는 것은 간단한 문제입니다. __repr__ 출력 후 인쇄하면 다른 개체와 동일한 인간 읽기 출력으로 가져옵니다.

>>> the_past = datetime.datetime(2015, 1, 24, 20, 5, 36, 491180)
>>> print(the_past)
2015-01-24 20:05:36.491180

어떻게 구현합니까?

개발할 때 가능하면 동일한 상태에서 객체를 재현 할 수 있기를 원합니다. 예를 들어 이것은 DateTime 객체가 정의하는 방법입니다. __repr__ (파이썬 소스). 그러한 객체를 재현하는 데 필요한 모든 속성 때문에 상당히 복잡합니다.

def __repr__(self):
    """Convert to formal string, for repr()."""
    L = [self._year, self._month, self._day,  # These are never zero
         self._hour, self._minute, self._second, self._microsecond]
    if L[-1] == 0:
        del L[-1]
    if L[-1] == 0:
        del L[-1]
    s = "%s.%s(%s)" % (self.__class__.__module__,
                       self.__class__.__qualname__,
                       ", ".join(map(str, L)))
    if self._tzinfo is not None:
        assert s[-1:] == ")"
        s = s[:-1] + ", tzinfo=%r" % self._tzinfo + ")"
    if self._fold:
        assert s[-1:] == ")"
        s = s[:-1] + ", fold=1)"
    return s

당신의 객체가 더 인간적인 읽기 쉬운 표현을 원한다면, 당신은 __str__ 다음. 다음은 DateTime 객체 (파이썬 소스) 구현 __str__, 이미 ISO 형식으로 표시 할 함수가 있기 때문에 쉽게 수행합니다.

def __str__(self):
    "Convert to string, for str()."
    return self.isoformat(sep=' ')

세트 __repr__ = __str__?

이것은 여기에서 설정을 제안하는 또 다른 대답에 대한 비판입니다. __repr__ = __str__.

환경 __repr__ = __str__ 어리석은 - __repr__ 폴백입니다 __str__ 그리고 a __repr__, 디버깅의 개발자 사용을 위해 작성된, 당신이 작성하기 전에 작성해야합니다. __str__.

당신은 필요합니다 __str__ 객체의 텍스트 표현이 필요할 때만.

결론

정의하다 __repr__ 귀하와 다른 개발자가 개발할 때 사용할 때 재현 가능한 예를 갖도록 작성하십시오. 정의하다 __str__ 인간 읽기 가능한 문자열 표현이 필요할 때.

주어진 모든 답변 외에도 몇 가지 요점을 추가하고 싶습니다.

1) __repr__() 대화식 파이썬 콘솔에 객체 이름을 작성하고 Enter를 누르면 호출됩니다.

2) __str__() 인쇄 문으로 개체를 사용할 때 호출됩니다.

3) 경우, if __str__ 누락 된 다음 인쇄 및 기능을 사용하여 기능합니다 str() 호출 __repr__() 물체의.

4) __str__() 컨테이너의 호출시 실행됩니다 __repr__() 포함 된 요소의 방법.

5) str() 내부에 호출 __str__() 기본 케이스없이 재발 할 수 있으며 최대 재귀 깊이에서 오류가 발생할 수 있습니다.

6) __repr__() 호출 할 수 있습니다 repr() 이미 표현 된 객체를 ....

책의 358 페이지에 계산 과학을위한 파이썬 스크립팅 Hans Petter Langtangen이 분명히 말합니다

  • 그만큼 __repr__ 객체의 완전한 문자열 표현을 목표로합니다.
  • 그만큼 __str__ 인쇄를 위해 멋진 끈을 반환하는 것입니다.

그래서 나는 그것들을 다음과 같이 이해하는 것을 선호합니다

  • repr = 재현
  • str = string (표현)

사용자의 관점에서 볼 때 이것은 파이썬을 배울 때 만든 오해입니다.

작지만 좋은 예는 다음과 같은 페이지에도 제공됩니다.

예시

In [38]: str('s')
Out[38]: 's'

In [39]: repr('s')
Out[39]: "'s'"

In [40]: eval(str('s'))
Traceback (most recent call last):

  File "<ipython-input-40-abd46c0c43e7>", line 1, in <module>
    eval(str('s'))

  File "<string>", line 1, in <module>

NameError: name 's' is not defined


In [41]: eval(repr('s'))
Out[41]: 's'

모든 정직으로 eval(repr(obj)) 사용되지 않습니다. 당신이 그것을 사용하고 있다면, 당신은 멈춰야합니다. eval 위험하고 문자열은 물체를 직렬화하는 매우 비효율적 인 방법입니다 (사용 pickle 대신에).

따라서 설정을 권장합니다 __repr__ = __str__. 그 이유는 그 이유입니다 str(list) 전화 repr 요소에서 (나는 이것이 Python 3에서 다루지 않은 Python의 가장 큰 디자인 결함 중 하나라고 생각합니다). 실제 repr 아마도 출력으로 그다지 도움이되지 않을 것입니다. print [your, objects].

이것을 자격을 얻으려면 내 경험에 따라 가장 유용한 사용 사례가 repr 함수는 문자열을 다른 문자열 안에 넣는 것입니다 (문자열 형식 사용). 이런 식으로, 당신은 따옴표 나 다른 것에 대해 걱정할 필요가 없습니다. 그러나 아무도 없다 eval 여기서 일어나고 있습니다.

간단히 말하면 :

__str__ 객체의 문자열 표현을 표시하는 데 사용됩니다. 쉽게 읽을 수 있습니다 다른 사람들에 의해.

__repr__ 문자열 표현을 표시하는 데 사용됩니다 그만큼 물체.

내가 만들고 싶다고 가정 해 봅시다 Fraction 분수의 문자열 표현이 '(1/2)'이고 객체 (분수 클래스)는 'fraction (1,2)으로 표시됩니다.

따라서 간단한 분수 클래스를 만들 수 있습니다.

class Fraction:
    def __init__(self, num, den):
        self.__num = num
        self.__den = den

    def __str__(self):
        return '(' + str(self.__num) + '/' + str(self.__den) + ')'

    def __repr__(self):
        return 'Fraction (' + str(self.__num) + ',' + str(self.__den) + ')'



f = Fraction(1,2)
print('I want to represent the Fraction STRING as ' + str(f)) # (1/2)
print('I want to represent the Fraction OBJECT as ', repr(f)) # Fraction (1,2)

에서 AN (비공식) Python Reference Wiki (아카이브 사본) by Effbot :

__str__ "객체의 "비공식"문자열 표현을 계산합니다. 이것은 다릅니다 __repr__ 유효한 파이썬 표현식 일 필요는 없다는 점에서 대신 더 편리하거나 간결한 표현이 사용될 수 있습니다."

다른 답변에서 누락 된 한 가지 측면. 일반적으로 패턴은 다음과 같습니다.

  • 목표 __str__: 사람이 읽을 수 있습니다
  • 목표 __repr__: 모호하지 않고 아마도 기계로 읽을 수 있습니다 eval

불행히도,이 차별화는 파이썬 대체와 ipython이 사용하기 때문에 결함이 있습니다. __repr__ REPL 콘솔의 물체 인쇄 (관련 질문 참조) 파이썬 그리고 IPYTHON). 따라서 대화식 콘솔 작업 (예 : Numpy 또는 Pandas)을 대상으로하는 프로젝트는 위의 규칙을 무시하고 인간이 읽을 수있는 것을 제공하기 시작했습니다. __repr__ 대신 구현.

str - 주어진 객체에서 새 문자열 객체를 만듭니다.

repr - 개체의 표준 문자열 표현을 반환합니다.

차이점들:

str () :

  • 물체를 읽을 수있게합니다
  • 최종 사용자의 출력을 생성합니다

repl () :

  • 객체를 재현하는 코드가 필요합니다
  • 개발자를위한 출력을 생성합니다

훌륭한 답변은 이미 차이점을 다룹니다 __str__ 그리고 __repr__, 나는 최종 사용자에 의해서도 읽을 수있는 전자에게 요약되며, 후자는 개발자에게 가능한 한 유용합니다. 그 점을 감안할 때, 나는 기본 구현이 __repr__ 이 목표를 달성하지 못하는 경우가 많습니다 생략 개발자에게 유용한 정보.

이런 이유로 단순하면 충분히 __str__, 나는 일반적으로 다음과 같은 것과 같은 두 세계의 최선을 다하려고 노력합니다.

def __repr__(self):
    return '{0} ({1})'.format(object.__repr__(self), str(self))

책에서 유창한 파이썬:

파이썬 객체의 기본 요구 사항은 디버깅 및 로깅에 사용되는 유용한 문자열 표현을 제공하는 것입니다. 그것이 이유입니다
특별한 방법 __repr__ 그리고 __str__ 데이터 모델에 존재합니다.

명심해야 할 중요한 것은 컨테이너의 __str__ 포함 된 개체를 사용합니다. __repr__.

>>> from datetime import datetime
>>> from decimal import Decimal
>>> print (Decimal('52'), datetime.now())
(Decimal('52'), datetime.datetime(2015, 11, 16, 10, 51, 26, 185000))
>>> str((Decimal('52'), datetime.now()))
"(Decimal('52'), datetime.datetime(2015, 11, 16, 10, 52, 22, 176000))"

파이썬은 가독성에 비해 명백한 것을 선호합니다,, __str__ a의 호출 tuple 포함 된 개체를 호출합니다. __repr__,, "공식적인" 대상의 표현. 공식적인 표현은 비공식적 인 표현보다 읽기가 어렵지만 버그에 대해 명확하지 않고 더 강력합니다.

간단히 말해서 :

class Demo:
  def __repr__(self):
    return 'repr'
  def __str__(self):
    return 'str'

demo = Demo()
print(demo) # use __str__, output 'str' to stdout

s = str(demo) # __str__ is used, return 'str'
r = repr(demo) # __repr__ is used, return 'repr'

import logging
logger = logging.getLogger(logging.INFO)
logger.info(demo) # use __str__, output 'str' to stdout

from pprint import pprint, pformat
pprint(demo) # use __repr__, output 'repr' to stdout
result = pformat(demo) # use __repr__, result is string which value is 'str'
>>> print(decimal.Decimal(23) / decimal.Decimal("1.05"))
21.90476190476190476190476190
>>> decimal.Decimal(23) / decimal.Decimal("1.05")
Decimal('21.90476190476190476190476190')

언제 print() 결과에 호출됩니다 decimal.Decimal(23) / decimal.Decimal("1.05") 원시 번호는 인쇄됩니다. 이 출력이 있습니다 문자열 양식 달성 할 수 있습니다 __str__(). 우리가 단순히 표현을 입력하면 우리는 a를 얻는다 decimal.Decimal 출력 -이 출력이 시작되었습니다 표현 형태 달성 할 수 있습니다 __repr__(). 모든 파이썬 객체에는 두 개의 출력 양식이 있습니다. 문자열 양식은 사람이 읽을 수 있도록 설계되었습니다. 표현 형태는 Python 통역사에게 공급되면 (가능하면) 대표적인 객체를 재현하는 출력을 생성하도록 설계되었습니다.

이해하다 __str__ 그리고 __repr__ 직관적이고 영구적으로 그들을 구별합니다.

__str__ 눈을 읽을 수 있도록 주어진 대상의 위장 된 몸체를 반환하십시오.
__repr__ 주어진 객체의 실제 육체를 반환하여 (반환)

예에서보십시오

In [30]: str(datetime.datetime.now())
Out[30]: '2017-12-07 15:41:14.002752'
Disguised in string form

에 관해서 __repr__

In [32]: datetime.datetime.now()
Out[32]: datetime.datetime(2017, 12, 7, 15, 43, 27, 297769)
Presence in real body which allows to be manipulated directly.

우리는 산술 작업을 수행 할 수 있습니다 __repr__ 편리하게 결과.

In [33]: datetime.datetime.now()
Out[33]: datetime.datetime(2017, 12, 7, 15, 47, 9, 741521)
In [34]: datetime.datetime(2017, 12, 7, 15, 47, 9, 741521) - datetime.datetime(2
    ...: 017, 12, 7, 15, 43, 27, 297769)
Out[34]: datetime.timedelta(0, 222, 443752)

작업을 적용하는 경우 __str__

In [35]: '2017-12-07 15:43:14.002752' - '2017-12-07 15:41:14.002752'
TypeError: unsupported operand type(s) for -: 'str' and 'str'

오류 외에는 아무것도 반환합니다.

또 다른 예.

In [36]: str('string_body')
Out[36]: 'string_body' # in string form

In [37]: repr('real_body')
Out[37]: "'real_body'" #its real body hide inside

이것이 더 많은 답변을 탐색하기 위해 구체적인 근거를 구축하는 데 도움이되기를 바랍니다.

__repr__ 제외한 모든 곳에서 사용됩니다 print 그리고 str 방법 (a __str__정의됩니다!)

  1. __str__ 문자열 객체를 반환해야합니다 __repr__ 파이썬 표현식을 반환 할 수 있습니다.
  2. 만약에 __str__ 그러면 구현이 누락되었습니다 __repr__ 함수는 폴백으로 사용됩니다. 만약은 폴백이 없습니다 __repr__ 기능 구현이 누락되었습니다.
  3. 만약에 __repr__ 함수는 객체의 문자열 표현을 반환하고 있습니다. __str__ 기능.

원천: https://www.journaldev.com/22460/python-str-repr-functions

__str__ 호출하여 물체에서 호출 할 수 있습니다 str(obj) 인간 읽기 가능한 끈을 반환해야합니다.

__repr__ 호출하여 물체에서 호출 할 수 있습니다 repr(obj) 내부 객체를 반환해야합니다 (개체 필드/속성)

이 예는 다음과 같이 도움이 될 수 있습니다.

class C1:pass

class C2:        
    def __str__(self):
        return str(f"{self.__class__.__name__} class str ")

class C3:        
    def __repr__(self):        
         return str(f"{self.__class__.__name__} class repr")

class C4:        
    def __str__(self):
        return str(f"{self.__class__.__name__} class str ")
    def __repr__(self):        
         return str(f"{self.__class__.__name__} class repr")


ci1 = C1()    
ci2 = C2()  
ci3 = C3()  
ci4 = C4()

print(ci1)       #<__main__.C1 object at 0x0000024C44A80C18>
print(str(ci1))  #<__main__.C1 object at 0x0000024C44A80C18>
print(repr(ci1)) #<__main__.C1 object at 0x0000024C44A80C18>
print(ci2)       #C2 class str
print(str(ci2))  #C2 class str
print(repr(ci2)) #<__main__.C2 object at 0x0000024C44AE12E8>
print(ci3)       #C3 class repr
print(str(ci3))  #C3 class repr
print(repr(ci3)) #C3 class repr
print(ci4)       #C4 class str 
print(str(ci4))  #C4 class str 
print(repr(ci4)) #C4 class repr
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top