关于python: __str__ 和 __repr__之间的区别?

The difference between __str__ and __repr__?

本问题已经有最佳答案,请猛点这里访问。

我写这个代码:

1
2
3
4
5
class Item:
    def __init__(self, name):
        self._name = name;
    def __str__(self):
        return"Item: %s" % self._name

当我奔跑

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

输出是

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

当我将代码更改为:

1
2
3
4
5
6
7
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

然后输出

1
(Item: Car,)

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


__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__方法相同。该方法的工作原理是调用tuple中每个项的__repr__方法,将它们与逗号(加上一个项目tuple的尾随方法)连接在一起,并用括号包围整个过程。我不知道为什么tuple__str__方法在其内容上不调用__str__,但它没有。