我刚刚遇到了这个问题,Python中__str__
和__repr__
的区别,它提到__repr__
的主要目的是明确的。但是我听说__repr__
的主要目的是生成一个字符串,以便 eval()
可以稍后重建python对象。实际上__repr__
的主要目的是什么?是否有任何内置函数或python中的任何默认模块固有地使用__repr__
来重建对象?如果我们只是重写__repr__
,使其返回一个常量字符串(例如:"foo")总是?
对于具有文字符号的类型(str
, int
, float
, list
等),repr()
返回一个字符串,可用于再次创建该类型。
很好,但不是必需的。
__repr__
的主要目的是为开发人员提供关于他们在这里有什么对象的明确信息,用于调试目的。
引用__repr__
文档:
由
repr()
内置函数调用,用于计算对象的"正式"字符串表示。如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(给定适当的环境)。如果不可能,则应返回<...some useful description...>
形式的字符串。
但最重要的是:
这通常用于调试,因此重要的是表示是信息丰富且明确的。
我特别强调。
从您的自定义类型返回一个常量字符串在技术上不会破坏任何东西,但会使您作为开发人员的生活更加困难。
约定是使用repr
获取表示对象的字符串,使用str
描述对象。repr
多用于调试,str
用于常规打印。其思想是repr的输出看起来像可以求值的代码,而且通常是这样的。然而,你不能依赖它。如果必须将对象转换为字符串,请使用pickle
或json
。
>>> greeting = "Hello"
>>> print str(greeting)
Hello
>>> print repr(greeting)
'Hello'
如果你正在编写自己的类,并且它非常简单,你可以使__repr__
返回一些可以计算的东西:
class Song(object):
def __init__(self, title, artist):
self.title = title
self.artist = artist
def __repr__(self):
return "Song(%r, %r)" % (self.title, self.artist)
def __str__(self):
return "%s - %s" % (self.artist, self.title)
注意我是如何使用%r
来获取标题和艺术家的repr
的。这将自动处理转义和引用(对于python),并允许我计算repr(a_song)
的结果,尽管在调试之外我不会这样做。同样,str
返回您要打印给用户的内容,repr
返回帮助您调试的内容。如果该类变得比这更复杂,您将无法从repr
返回完整的或可求值的东西。这里的约定是返回一个简洁的字符串来标识您的实例,通常带有尖括号:
>>> repr(type(None))
"<type 'NoneType'>"
>>> import gtk
>>> win = gtk.Window()
>>> repr(win)
'<gtk.Window object at 0x10de45690 (GtkWindow at 0x7fdd89240000)>'