2015-01-23 2 views
0

저는 파이썬을 빠르게 배우면서 객체의 표현형 및 문자열 형식뿐만 아니라 대리 번호 메소드와 혼동을 겪고 있습니다. 나는 전화 X = 점 (1, 3) 다음 코드를 사용하여 얻을 :! r에 변환 필드가 평가를 사용하여 다른 동일한 개체를 만드는 파이썬에 의해 평가 될 수있는 문자열의 변수를 나타내는입니다문자열을 형식화하는 파이썬의 표현식

class Point(): 
def __init__(self, x, y): 
    '''Initilizae the object''' 
    self.x = x 
    self.y = y 
def __repr__(self): 
    return "Point({0.x!r}, {0.y!r})".format(self) 
def distance_from_origin(self): 
    return math.hypot(self.x, self.y) 
>>>x 
Point(1, 3) 

경우 없는이 작업을 수행하는 이유() 문은! 포인트 (1, 3) 또는 이와 유사한 :

class Point(): 
    def __init__(self, x, y): 
     '''Initilizae the object''' 
     self.x = x 
     self.y = y 
    def __repr__(self): 
     return "{!r}".format(self) 
    def distance_from_origin(self): 
     return math.hypot(self.x, self.y) 
>>>x 
File "C:\...\...\examplepoint.py, line 8, in __repr__ 
    return "{!r}".format(self) 
File "C:\...\...\examplepoint.py, line 8, in __repr__ 
    return "{!r}".format(self) 
File "C:\...\...\examplepoint.py, line 8, in __repr__ 
    return "{!r}".format(self) 
File "C:\...\...\examplepoint.py, line 8, in __repr__ 
    return "{!r}".format(self) 
The same error for 100 more lines 
RuntimeError: maximum recursion depth exceeded 

본인은 R 규격은 같을 것이다 표현 형태의 문자열로 객체 X 형 포인트를 만들 것이라고 생각 첫 번째 실행합니다. 파이썬은이 표현을 문자열 형식으로 정확히 어떻게 표현합니까? 정확히 무엇을 의미합니까? 두 번째 예제가 작동하지 않는 이유는 무엇입니까?

+0

여기 [파이썬 문자열 형식 :! s 변환 플래그를 사용하는 경우] (http://stackoverflow.com/questions/25441628/python-string-format-when-to-use-s-conversion- 깃발). "현재 두 개의 변환 플래그가 지원됩니다. '! s'는 값에 str()을 호출하고 repr()을 호출하는 '! r'을 나타냅니다. – Lack

답변

2

!rrepr() (내부적으로 __repr__)을 호출하여 문자열을 가져옵니다. __repr__의 정의에서 물체의 표현을 요구하는 것은 이치에 맞지 않습니다. 그것은 재귀 적입니다. 이것은 역 추적이 알려주는 것입니다. 객체의 표현을 평가할 수 있어야한다는 요구 사항은 없으며 Python은 이러한 표현을 작성하지 않습니다.

관련 문제