class Person:
greeting = 'Hello'
def __repr__(self):
return self.greeting
>>> Sam = Person()
>>> Sam.greeting
'Hello'
>>> Sam
Hello
我難以理解爲什麼__repr__函數返回self.greeting不帶引號。任何幫助是極大的讚賞。這個__repr__函數爲什麼不返回一個字符串?
class Person:
greeting = 'Hello'
def __repr__(self):
return self.greeting
>>> Sam = Person()
>>> Sam.greeting
'Hello'
>>> Sam
Hello
我難以理解爲什麼__repr__函數返回self.greeting不帶引號。任何幫助是極大的讚賞。這個__repr__函數爲什麼不返回一個字符串?
的REPL輸出對象的repr
。
如果你說
>>> 'Hello'
的「Hello
」顯示,在再版這是「'Hello'
」
既然你正在返回Hello
而不是'Hello'
- 這就是顯示在REPL
如果你想Person.repr
像普通字符串repr
一樣工作,你可以撥打電話repr
self.greeting
>>> class Person:
... greeting = 'Hello'
... def __repr__(self):
... return repr(self.greeting)
...
>>> Sam = Person()
>>> Sam
'Hello'
感謝您的快速回復。不過,我仍然有些困惑。我不是在這裏回覆'你好'嗎? self.greeting的表達式評估爲「Hello」,這就是\ __ repr__應該返回到我的理解中。 – springle
@ user3052943,我覺得引用讓你感到困惑。問候語有5個字母。如果您將其作爲repr返回,那麼這5個字母就是顯示的內容。你不希望額外的引號自動添加,因爲那樣就不可能爲int,list,dict等做替換。 –
在這裏和我一起......我的根本困惑基本上歸結爲這個。像你說的那樣,REPL應該輸出對象的'repr'。但是,如果我通過輸入'Sam .__ repr __()'顯式調用'Person'的'repr',它將返回引號中的字符串。自動調用'repr'函數和這個顯式調用之間有什麼區別? – springle
要明白是怎麼回事,讓我們跟隨REPL的「思維過程」:
考慮輸入Sam
:
Person
對象。repr()
從步驟1和每個類的定義,我回來了串Hello
(五個字符,沒有引號)。print()
。print()
輸出字符串,這樣你就不會得到任何。現在考慮s.greeting
:
str
對象。repr()
從步驟1每str
的__repr__()
方法(其中有邏輯加引號,因爲它知道表示字符串需要引號),我回來了串'Hello'
(七個字符,包括實際報價)。print()
。
'__repr__'不會奇怪地在字符串周圍加引號,如果你想引用返回'repr(self.greeting)'。 –
但是,如果我明確地調用'Sam .__ repr __()',它將會返回帶引號的'Hello'。在我看來,交互式提示消除了一層引號,但我傾向於認爲情況並非如此。 – springle
字符串的'repr'表示看起來像:'''Hello''''不''Hello''。 –