__str__和__repr__的区别是什么?

10

我写了这段代码:

class Item:
    def __init__(self, name):
        self._name = name;
    def __str__(self):
        return "Item: %s" % self._name

当我运行时

print((Item("Car"),))

输出结果为

(<__main__.Item object at 0x0000000002D32400>,)

当我将代码更改为以下内容:

class Item:
    def __init__(self, name):
        self._name = name;
    def __repr__(self):
        return "Item: %s" % self._name
    def __str__(self):
        return "Item: %s" % self._name

然后它输出

(Item: Car,)

所以现在我对__repr____str__之间的区别感到困惑。

1个回答

18

__str____repr__都是用于获取对象的字符串表示的方法。__str__应该更短,更用户友好,而__repr__则应提供更多细节。

具体来说,对于许多数据类型,__repr__返回一个字符串,如果您将其粘贴回Python中,则会生成一个有效的表达式,其值等于原始值。例如,str('Hello')返回'Hello',但repr('Hello')返回"'Hello'",其中字符串内部有引号标记。如果您打印出该字符串,则会得到'Hello',如果您将其粘贴回Python中,则会得到原始字符串。

某些数据类型(如文件对象)无法以这种方式转换为字符串。此类对象的__repr__方法通常返回一个包括对象的数据类型和内存地址在内的尖括号字符串。如果未显式定义__repr__方法,则用户定义的类也会执行此操作。

当您在REPL中计算一个值时,Python会调用__repr__方法将其转换为字符串。但是,当您使用print时,Python会调用__str__

当您调用print((Item(“Car”),))时,您正在调用tuple类的__str__方法,该方法与其__repr__方法相同。该方法通过调用元组中每个项的__repr__方法,使用逗号将它们连接在一起(对于一个元素的元组还会加上后跟的一个逗号),并将整个内容括在括号中。我不确定为什么 tuple 的__str__方法不会调用其内容的__str__方法,但实际上没有。


抢先一步了! :) http://docs.python.org/2/reference/datamodel.html#object.__repr__ - Prashant Kumar
你也抢先一步了!不过,添加一个注释说明__repr__通常应该是一个能够重现对象的语句会很有用。从文档中可以看到:“这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象”。 - Joe Kington
我意识到我完全错过了问题的实际要点。已修复。 - Taymon
1
一个小例子:from datetime import datetime as dt; dt.today().__str__(); dt.today().__repr__(). - Prashant Kumar

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