2015-10-20 186 views
2
class Person: 
    greeting = 'Hello' 
    def __repr__(self): 
     return self.greeting 

>>> Sam = Person() 
>>> Sam.greeting 
'Hello' 
>>> Sam 
Hello 

我難以理解爲什麼__repr__函數返回self.greeting不帶引號。任何幫助是極大的讚賞。這個__repr__函數爲什麼不返回一個字符串?

+2

'__repr__'不會奇怪地在字符串周圍加引號,如果你想引用返回'repr(self.greeting)'。 –

+0

但是,如果我明確地調用'Sam .__ repr __()',它將會返回帶引號的'Hello'。在我看來,交互式提示消除了一層引號,但我傾向於認爲情況並非如此。 – springle

+0

字符串的'repr'表示看起來像:'''Hello''''不''Hello''。 –

回答

2

的REPL輸出對象的repr

如果你說

>>> 'Hello' 

的「Hello」顯示,在再版這是「'Hello'

既然你正在返回Hello而不是'Hello' - 這就是顯示在REPL

如果你想Person.repr像普通字符串repr一樣工作,你可以撥打電話reprself.greeting

>>> class Person: 
...  greeting = 'Hello' 
...  def __repr__(self): 
...   return repr(self.greeting) 
... 
>>> Sam = Person() 
>>> Sam 
'Hello' 
+0

感謝您的快速回復。不過,我仍然有些困惑。我不是在這裏回覆'你好'嗎? self.greeting的表達式評估爲「Hello」,這就是\ __ repr__應該返回到我的理解中。 – springle

+0

@ user3052943,我覺得引用讓你感到困惑。問候語有5個字母。如果您將其作爲repr返回,那麼這5個字母就是顯示的內容。你不希望額外的引號自動添加,因爲那樣就不可能爲int,list,dict等做替換。 –

+0

在這裏和我一起......我的根本困惑基本上歸結爲這個。像你說的那樣,REPL應該輸出對象的'repr'。但是,如果我通過輸入'Sam .__ repr __()'顯式調用'Person'的'repr',它將返回引號中的字符串。自動調用'repr'函數和這個顯式調用之間有什麼區別? – springle

0

要明白是怎麼回事,讓我們跟隨REPL的「思維過程」:

考慮輸入Sam

  1. 這裏有一個對象我想要顯示。這是一個Person對象。
  2. 我呼籲的事情repr()從步驟1和每個類的定義,我回來了串Hello(五個字符,沒有引號)。
  3. 實際顯示步驟2中的事情,我呼籲它print()
  4. 我敢肯定,我們都同意,沒有語法引號print()輸出字符串,這樣你就不會得到任何。

現在考慮s.greeting

  1. 這裏有一個對象我想要顯示。這是一個str對象。
  2. 我呼籲的事情repr()從步驟1每str__repr__()方法(其中有邏輯加引號,因爲它知道表示字符串需要引號),我回來了串'Hello'(七個字符,包括實際報價)。
  3. 實際顯示步驟2中的事情,我呼籲它print()
  4. 由於字符串實際上包含這些引號,它們出現在輸出中。
相關問題