我写这段代码:
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__
之间的区别感到困惑。
答案 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
,但事实并非如此。