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__

4

1 回答 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"),)),您正在调用该类的__str__方法tuple,这与它的__repr__方法相同。该方法的工作原理是调用__repr__元组中每个项目的方法,用逗号将它们连接在一起(加上一个尾随的一个用于单项元组),并用括号将整个事物括起来。我不确定为什么__str__方法tuple不调用__str__它的内容,但它没有。

于 2013-08-23T02:31:52.880 回答