class Person:
greeting = 'Hello'
def __repr__(self):
return self.greeting
>>> Sam = Person()
>>> Sam.greeting
'Hello'
>>> Sam
Hello
我有困难理解为什么__repr__函数返回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'
'Hello'
吗?表达式self.greeting的值为'Hello'
,根据我的理解,这就是__repr__应该返回的。 - springlerepr
,就像你说的那样。然而,如果我通过输入Sam.__repr__()
显式调用Person
的repr
,它会返回带引号的字符串。自动调用repr
函数和这个显式调用之间有什么区别? - springle为了理解这里发生的事情,让我们跟随REPL的“思维过程”:
考虑输入Sam
:
Person
对象。repr()
,根据类定义,我会得到字符串Hello
(五个字符而没有引号)。print()
。print()
打印字符串时不带语法引号,因此你不会得到任何引号。现在考虑s.greeting
:
str
对象。repr()
。根据 str
的 __repr__()
方法(该方法具有添加引号的逻辑,因为它知道字符串的表示需要引号),我得到字符串 'Hello'
(包括实际引号在内共七个字符)。print()
。如果你调用 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)
__repr__
不会自动在字符串周围添加引号,如果你想要引号,请返回repr(self.greeting)
。 - Ashwini ChaudharySam.__repr__()
,它会带着引号返回'Hello'
。在我看来,交互式提示似乎去掉了一层引号,但我倾向于认为这不是这样的情况。 - springlerepr
表示形式看起来像这样:"'Hello'"
而不是'Hello'
。 - Ashwini Chaudhary__repr__
函数以查看它是否返回字符串吗?我想你没有。尝试调用Sam.__repr__()
以查看它是否返回一个字符串。同时,repr(Sam)
也会返回一个字符串。 - skyking