__str__和__repr__之间的区别?

时间:2013-08-23 02:28:50

标签: python

我写这段代码:

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 个答案:

答案 0 :(得分:17)

__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"),))时,您正在调用__str__类的tuple方法,该方法与其__repr__方法相同。该方法的工作原理是调用元组中每个项目的__repr__方法,用逗号连接它们(加上一个项目元组的尾随),然后用括号括起整个事物。我不确定为什么__str__的{​​{1}}方法不会在其内容上调用tuple,但事实并非如此。