为什么这个 __repr__ 函数 return 不是一个字符串?

Why doesn't this __repr__ function return a string?

class Person:
    greeting = 'Hello'
    def __repr__(self):
        return self.greeting

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

我很难理解为什么 __repr__ 函数 returns self.greeting 没有引号。非常感谢任何帮助。

REPL输出对象的repr

如果你说

>>> 'Hello'

显示“Hello”的repr,即“'Hello'

因为您要返回 Hello 而不是 'Hello' - 这就是 REPL

中显示的内容

如果您希望 Person.repr 像普通字符串 repr 一样工作,您只需在 self.greeting

上调用 repr
>>> class Person:
...     greeting = 'Hello'
...     def __repr__(self):
...         return repr(self.greeting)
... 
>>> Sam = Person()
>>> Sam
'Hello'

要了解这里发生了什么,让我们跟随 REPL 的 "thought process":

考虑输入 Sam:

  1. 这是我要显示的对象。这是一个 Person 对象。
  2. 我对第 1 步中的事物调用 repr(),根据 class 定义,我得到了字符串 Hello(五个字符,没有引号)。
  3. 为了实际显示第 2 步中的内容,我对其调用 print()
  4. 我相信我们都同意 print() 打印不带句法引号的字符串,因此您不会得到任何引号。

现在考虑 s.greeting:

  1. 这是我要显示的对象。这是一个 str 对象。
  2. 我在步骤 1 中调用 repr()。根据 str__repr__() 方法(它具有添加引号的逻辑,因为它知道 表示 的字符串需要引号),我取回字符串 'Hello'(七个字符,包括实际引号)。
  3. 为了实际显示第 2 步中的内容,我对其调用 print()
  4. 由于字符串实际上包含这些引号,因此它们出现在输出中。

如果你调用repr()函数,它returns Person对象。但是如果你想 return 字符串值,你可以使用 str()

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        rep = 'Person(' + self.name + ',' + str(self.age) + ')'
        return rep

person = Person("John", 24)```
print(repr(person)) # Person(John,24)