Python object .__ repr __ (self)는 표현식이어야합니까?
나는 파이썬 문서 에서 빌트인 객체 메소드를보고 있었고 , object.__repr__(self)
. 내용은 다음과 같습니다.
repr () 내장 함수 및 문자열 변환 (역 따옴표)에 의해 호출되어 객체의 "공식적인"문자열 표현을 계산합니다. 가능하다면 이것은 같은 값 (적절한 환경이 주어진 경우)을 가진 객체를 다시 만드는 데 사용할 수있는 유효한 Python 표현식처럼 보일 것입니다. 이것이 불가능하면 <... 유용한 설명 ...> 형식의 문자열이 반환되어야합니다. 반환 값은 문자열 개체 여야합니다. 클래스가 repr ()을 정의 하지만 str () 은 정의 하지 않은 경우 해당 클래스의 인스턴스에 대한 "비공식"문자열 표현이 필요할 때 repr ()도 사용됩니다.
일반적으로 디버깅에 사용되므로 정보가 풍부하고 모호하지 않은 표현이 중요합니다.
나에게 가장 흥미로운 부분은 ...
가능하다면 동일한 값을 가진 객체를 다시 만드는 데 사용할 수있는 유효한 Python 표현식처럼 보일 것입니다.
...하지만 이것이 무엇을 의미하는지 정확히 모르겠습니다. 그것은해야한다고 말했습니다 보이는 개체를 다시 사용할 수있는 표현처럼,하지만 (평균 그냥 당신이 사용할 수있는 표현의 종류의 예를 들어 있어야하거나 실행할 수있는 실제 표현해야한다는 평가를 수행 등.) 개체를 다시 만들려면? 아니면 ... 순수한 정보 목적으로 사용 된 실제 표현을 다시 정리해야합니까?
일반적으로 여기에 정확히 무엇을 넣어야하는지 약간 혼란 스럽습니다.
>>> from datetime import date
>>>
>>> repr(date.today()) # calls date.today().__repr__()
'datetime.date(2009, 1, 16)'
>>> eval(_) # _ is the output of the last command
datetime.date(2009, 1, 16)
출력은 파이썬 인터프리터가 구문 분석 할 수있는 문자열이며 결과는 동일한 객체입니다.
가능하지 않은 경우 .NET 형식의 문자열을 반환해야합니다 <...some useful description...>
.
평가할 때 이것과 똑같은 속성을 가진 객체를 생성하는 파이썬 표현식이어야합니다. 예를 들어, Fraction
두 개의 정수 (분자 및 분모)가 포함 된 클래스 가있는 경우 __repr__()
메서드는 다음과 같습니다.
# in the definition of Fraction class
def __repr__(self):
return "Fraction(%d, %d)" % (self.numerator, self.denominator)
생성자가이 두 값을 취한다고 가정합니다.
가이드 라인 : 당신이 간결 제공 할 수있는 경우 정확한 표현을 , 파이썬 표현으로 포맷 (이 모두 eval'd하고 올바른 맥락에서, 소스 코드에 직접 복사 할 수 있음을 의미한다). 제공하는 경우 부정확 한 표현을 , 사용하는 <...>
형식 .
모든 값에 대해 가능한 많은 표현이 있지만 Python 프로그래머에게 가장 흥미로운 것은 값을 다시 만드는 표현입니다. Python을 이해 하는 사람들은 대상 청중 이며, 그렇기 때문에 부정확 한 표현에는 관련 컨텍스트가 포함되어야합니다. <XXX object at 0xNNN>
거의 완전히 쓸모가 없지만 기본조차도 여전히 유형을 제공하고 id()
(다른 객체를 구별하기 위해) 더 나은 표현을 사용할 수 없음을 나타냅니다.
"하지만 그것은 당신이 사용할 수있는 일종의 표현의 예일뿐, 아니면 객체를 재생성하기 위해 실행될 수있는 (평가 등 ..) 실제 표현이어야한다는 것을 의미합니까? 아니면 ... 순수한 정보 목적을 위해 사용 된 실제 표현을 다시 정리 한 것입니까? "
와우, 그것은 많은 손으로 찡그린 다.
"사용할 수있는 일종의 표현의 예"는 특정 개체의 표현이 아닙니다. 유용하거나 의미가 없습니다.
"객체를 재현 할 수있는 실제 표현"과 "[객체를 생성하기 위해] 사용 된 실제 표현의 재구성"의 차이점은 무엇입니까? 둘 다 객체를 생성하는 표현식입니다. 이것들 사이에는 실질적인 차이가 없습니다. repr 호출은 새 표현식 또는 원래 표현식을 생성 할 수 있습니다. 대부분의 경우 동일합니다.
이것이 항상 가능하거나 실용적이거나 바람직한 것은 아닙니다.
어떤 경우에는 repr () 이 어떤 종류의 표현식도 아닌 문자열을 제공한다는 것을 알 수 있습니다. 정의한 클래스의 기본 repr ()은 표현식으로 유용하지 않습니다.
경우에 따라 개체간에 상호 (또는 순환) 참조가있을 수 있습니다. 얽힌 계층 구조의 repr ()은 의미가 없습니다.
대부분의 경우 객체는 파서를 통해 점진적으로 빌드됩니다. 예를 들어, XML이나 JSON 등에서. repr은 무엇입니까? 원본 XML 또는 JSON? 그들은 Python이 아니기 때문에 분명히 아닙니다. XML을 생성 한 Python 표현식 일 수 있습니다. 그러나 거대한 XML 문서의 경우 XML 구문 분석과 기능적으로 동등한 단일 Python 표현식을 작성하는 것이 불가능할 수 있습니다.
'repr'은 표현을 의미합니다. 먼저 클래스 좌표의 인스턴스를 만듭니다.
x = Coordinate(3, 4)
그런 다음 콘솔에 x를 입력하면 출력은
<__main__.Coordinate at 0x7fcd40ab27b8>
repr ()을 사용하는 경우 :
>>> repr(x)
Coordinate(3, 4)
출력은 'Coordinate (3, 4)'와 동일하지만 문자열을 제외하고는 좌표 인스턴스를 다시 생성하는 데 사용할 수 있습니다.
결론적으로, repr () meathod는 객체의 표현 인 문자열을 출력합니다.
repr이 클래스 내에서 어떻게 작동하는지 보려면 먼저 repr 메서드 를 사용하거나 사용하지 않고 다음 코드를 실행합니다 .
class Coordinate (object):
def __init__(self,x,y):
self.x = x
self.y = y
def getX(self):
# Getter method for a Coordinate object's x coordinate.
# Getter methods are better practice than just accessing an attribute directly
return self.x
def getY(self):
# Getter method for a Coordinate object's y coordinate
return self.y
def __repr__(self): #remove this and the next line and re-run
return 'Coordinate(' + str(self.getX()) + ',' + str(self.getY()) + ')'
>>>c = Coordinate(2,-8)
>>>print(c)
여기에있는 혼란은 영어에서 유래했다고 생각합니다. 내 말은 __repr__()
; @ S.Lott가 말한 것처럼 내가 추측하는 값의 '표현'의 줄임말
"What is the difference between "an actual expression, that can ... recreate the object" and "a rehasing of the actual expression which was used [to create the object]"? Both are an expression that creates the object. There's no practical distinction between these. A repr call could produce either a new expression or the original expression. In many cases, they're the same."
But in some cases they might be different. E.g; coordinate points, you might want c.coordinate
to return: 3,5
but c.__repr__
to return Coordinate(3, 5)
. Hope that makes more sense...
참고URL : https://stackoverflow.com/questions/452300/python-object-repr-self-should-be-an-expression
'programing tip' 카테고리의 다른 글
Android에서 EditText를 입력 한 후 키보드를 숨기는 방법은 무엇입니까? (0) | 2020.11.06 |
---|---|
주소를 위도 / 경도로 변환하는 방법은 무엇입니까? (0) | 2020.11.05 |
xcode에서 탭을 활성화 하시겠습니까? (0) | 2020.11.05 |
'행렬에 값 X가 포함되어 있습니까?'에 대한 함수 (0) | 2020.11.05 |
스크립트와 프로그램의 차이점은 무엇입니까? (0) | 2020.11.05 |