为什么这个__repr__函数没有返回一个字符串?

时间:2015-10-20 05:56:07

标签: python repr

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

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

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

2 个答案:

答案 0 :(得分:2)

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'

答案 1 :(得分:0)

要了解这里发生了什么,让我们按照REPL的“思考过程”进行:

考虑输入Sam

  1. 这是我要显示的对象。这是一个Person对象。
  2. 我从第1步开始调用repr(),根据类定义,我找回字符串Hello(五个字符,没有引号)。
  3. 要实际显示第2步中的内容,我会在其上调用print()
  4. 我确信我们都同意print()打印没有句法引号的字符串,所以你没有得到任何字符串。
  5. 现在考虑s.greeting

    1. 这是我要显示的对象。这是一个str对象。
    2. 我从步骤1开始调用repr()。每个str的{​​{1}}方法(其中包含添加引号的逻辑,因为它知道表示一个字符串需要引号),我找回字符串__repr__()(七个字符,包括实际引号)。
    3. 要实际显示第2步中的内容,我会在其上调用'Hello'
    4. 由于字符串实际上包含这些引号,因此它们出现在输出中。