3 回答
TA贡献1844条经验 获得超8个赞
经常使用它们的一个地方是互动会话。如果您打印一个对象,则将__str__调用其方法,而如果您仅使用一个对象,__repr__则会显示该对象:
>>> from decimal import Decimal
>>> a = Decimal(1.25)
>>> print(a)
1.25 <---- this is from __str__
>>> a
Decimal('1.25') <---- this is from __repr__
的__str__目的是尽可能使人可读,而的__repr__目的应该是可以用来重新创建对象的内容,尽管在这种情况下,它通常不是创建对象的确切方式。
两者__str__并__repr__返回相同的值(对于内置类型肯定是这样)也很常见。
TA贡献2021条经验 获得超8个赞
建立在先前的答案之上,并显示更多示例。如果使用正确,则str和之间的区别repr很明显。总之repr应当返回一个可复制粘贴到重建对象的确切状态的字符串,而str为有用logging和observing调试结果。以下是一些示例,以查看某些已知库的不同输出。
约会时间
print repr(datetime.now()) #datetime.datetime(2017, 12, 12, 18, 49, 27, 134411)
print str(datetime.now()) #2017-12-12 18:49:27.134452
可以将str其打印到日志文件中,repr如果要直接运行该日志文件或将其作为命令转储到文件中,可以将其重新用途。
x = datetime.datetime(2017, 12, 12, 18, 49, 27, 134411)
脾气暴躁的
print repr(np.array([1,2,3,4,5])) #array([1, 2, 3, 4, 5])
print str(np.array([1,2,3,4,5])) #[1 2 3 4 5]
在Numpy中,它又repr可以直接消费。
自定义Vector3示例
class Vector3(object):
def __init__(self, args):
self.x = args[0]
self.y = args[1]
self.z = args[2]
def __str__(self):
return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z)
def __repr__(self):
return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z)
在此示例中,repr再次返回可以直接使用/执行的字符串,而str作为调试输出更为有用。
v = Vector3([1,2,3])
print str(v) #x: 1, y: 2, z: 3
print repr(v) #Vector3([1,2,3])
有一点要记住,如果str没有定义,但是repr,str会自动调用repr。因此,至少定义一个总是好的repr
添加回答
举报