Python 为什么';这个函数不返回字符串吗?
我很难理解为什么_repr_________)函数返回self.greeting而不加引号。非常感谢您的帮助。REPL输出对象的Python 为什么';这个函数不返回字符串吗?,python,repr,Python,Repr,我很难理解为什么_repr_________)函数返回self.greeting而不加引号。非常感谢您的帮助。REPL输出对象的repr 如果你说 class Person: greeting = 'Hello' def __repr__(self): return self.greeting >>> Sam = Person() >>> Sam.greeting 'Hello' >>> Sam Hello
repr
如果你说
class Person:
greeting = 'Hello'
def __repr__(self):
return self.greeting
>>> Sam = Person()
>>> Sam.greeting
'Hello'
>>> Sam
Hello
将显示“Hello
”的报告,即“'Hello'
”
因为您返回的是Hello
,而不是'Hello'
——这就是REPL中显示的内容
如果您想让Person.repr
像普通字符串repr
一样工作,您可以在self.greeting
上调用repr
>>> 'Hello'
为了了解这里发生了什么,让我们遵循REPL的“思考过程”: 考虑键入Sam:
人
对象repr()
,根据类定义,我得到字符串Hello
(五个字符,没有引号)print()
print()
打印字符串时不带语法引号,因此您不会得到任何语法引号现在考虑<代码> S.问候> /代码>:
str
对象repr()
。根据str
的\uuuu repr\uuuu()
方法(该方法具有添加引号的逻辑,因为它知道字符串的表示形式需要引号),我将返回字符串'Hello'
(七个字符,包括实际引号)print()
\uuuu repr\uuuu
不会神奇地在字符串周围添加引号,如果您希望引号返回repr(self.greeting)
。但是如果我显式调用Sam.\uuu repr\uuuu()
,它会返回带有引号的“Hello”
。在我看来,交互提示似乎去掉了一层引号,但我倾向于认为情况并非如此。字符串的repr
表示形式类似于:“'Hello'”
而不是'Hello'
。您是否尝试调用\urepr\uuu
以查看它是否不返回字符串?我想不是。尝试Sam.\uu repr\uuu()
并查看它是否返回字符串。另外,repr(Sam)
将返回一个字符串。感谢您的快速响应。不过,我还是有点困惑。我不是在这里回“你好”吗?表达式self.greeting的计算结果是“Hello”,这就是我应该重新理解的内容。@user3052943,我认为引号让您感到困惑。问候语有5个字母。如果您将其作为repr返回,则显示的正是这5个字母。您不希望自动添加额外的引号,因为这样就不可能在这里对int、list、dict等进行报告。。我的基本困惑基本上归结为这一点。REPL应该输出对象的repr
,如您所说。但是,如果我通过输入Sam.\uuu repr\uuu()
显式调用Person
的repr
,它将返回引号中的字符串。repr
函数的自动调用与此显式调用之间有什么区别?@user3052943,如果在Person上调用repr,则返回值为字符串。REPR调用该字符串上的REPR,因此自然会在该阶段添加引号
>>> class Person:
... greeting = 'Hello'
... def __repr__(self):
... return repr(self.greeting)
...
>>> Sam = Person()
>>> Sam
'Hello'