__str__와 __repr__의 차이?
-
08-07-2019 - |
문제
차이점은 무엇입니까? __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__
정의됩니다!)
__str__
문자열 객체를 반환해야합니다__repr__
파이썬 표현식을 반환 할 수 있습니다.- 만약에
__str__
그러면 구현이 누락되었습니다__repr__
함수는 폴백으로 사용됩니다. 만약은 폴백이 없습니다__repr__
기능 구현이 누락되었습니다. - 만약에
__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