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

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

我很难理解为什么 __repr__ 函数返回 self.greeting 而不带引号。任何帮助是极大的赞赏。

4

3 回答 3

3

REPL 输出repr对象的。

如果你说

>>> 'Hello'

显示“”的repr 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'
于 2015-10-20T06:03:29.393 回答
0

要了解这里发生了什么,让我们遵循 REPL 的“思考过程”:

考虑输入Sam

  1. 这是我要显示的对象。这是一个Person对象。
  2. repr()从第 1 步调用了这个东西,根据类定义,我得到了字符串Hello(五个字符,没有引号)。
  3. 为了真正显示第 2 步中的内容,我调用print()了它。
  4. 我相信我们都同意print()打印没有语法引号的字符串,所以你什么也得不到。

现在考虑s.greeting

  1. 这是我要显示的对象。这是一个str对象。
  2. repr()从第 1 步调用这个东西。 Perstr__repr__()方法(它具有添加引号的逻辑,因为它知道字符串的表示需要引号),我取回字符串'Hello'(七个字符,包括实际引号)。
  3. 为了真正显示第 2 步中的内容,我调用print()了它。
  4. 由于字符串实际上包含这些引号,因此它们出现在输出中。
于 2016-10-11T16:35:11.190 回答
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)
于 2022-02-13T19:05:08.287 回答