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

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

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

我有困难理解为什么__repr__函数返回self.greeting时没有引号。非常感谢您的帮助。

2
__repr__ 不会自动在字符串周围添加引号,如果你想要引号,请返回 repr(self.greeting) - Ashwini Chaudhary
但是,如果我显式地调用 Sam.__repr__(),它会带着引号返回 'Hello'。在我看来,交互式提示似乎去掉了一层引号,但我倾向于认为这不是这样的情况。 - springle
字符串的 repr 表示形式看起来像这样:"'Hello'" 而不是 'Hello' - Ashwini Chaudhary
1
你试过实际调用 __repr__ 函数以查看它是否返回字符串吗?我想你没有。尝试调用 Sam.__repr__() 以查看它是否返回一个字符串。同时,repr(Sam) 也会返回一个字符串。 - skyking
3个回答

4

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'

谢谢您的快速回复。不过我还是有点困惑。这里我难道不是返回了'Hello'吗?表达式self.greeting的值为'Hello',根据我的理解,这就是__repr__应该返回的。 - springle
@user3052943,我认为引号让你感到困惑了。问候语有5个字母。如果你将其作为repr返回,那么这5个字母就是确切的显示内容。你不希望自动添加额外的引号,因为这样做int、list、dict等的repr就无法实现。 - John La Rooy
请耐心等待,我的基本困惑归结为以下几点。REPL应该输出对象的repr,就像你说的那样。然而,如果我通过输入Sam.__repr__()显式调用Personrepr,它会返回带引号的字符串。自动调用repr函数和这个显式调用之间有什么区别? - springle
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - John La Rooy

0

为了理解这里发生的事情,让我们跟随REPL的“思维过程”:

考虑输入Sam

  1. 这里有一个我要显示的对象。它是一个Person对象。
  2. 我在步骤1中对这个东西调用repr(),根据类定义,我会得到字符串Hello(五个字符而没有引号)。
  3. 为了实际显示步骤2中的东西,我在它上面调用print()
  4. 我相信我们都会同意,print()打印字符串时不带语法引号,因此你不会得到任何引号。

现在考虑s.greeting

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

0

如果你调用 repr() 函数,它会返回 Person 对象。但是如果你想要返回字符串值,你可以使用 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接