Python 为什么';这个函数不返回字符串吗?

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_________)函数返回self.greeting而不加引号。非常感谢您的帮助。

REPL输出对象的
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:

  • 这是我想显示的一个对象。它是一个
    对象
  • 我从步骤1调用
    repr()
    ,根据类定义,我得到字符串
    Hello
    (五个字符,没有引号)
  • 为了实际显示步骤2中的内容,我在上面调用
    print()
  • 我相信大家都同意,
    print()
    打印字符串时不带语法引号,因此您不会得到任何语法引号
  • 现在考虑<代码> S.问候> /代码>:

  • 这是我想显示的一个对象。这是一个
    str
    对象
  • 我对步骤1中的对象调用
    repr()
    。根据
    str
    \uuuu repr\uuuu()
    方法(该方法具有添加引号的逻辑,因为它知道字符串的表示形式需要引号),我将返回字符串
    'Hello'
    (七个字符,包括实际引号)
  • 为了实际显示步骤2中的内容,我在上面调用
    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'