我刚刚遇到了这个问题Python 之间的区别__str__
和__repr__
它提到的主要目的__repr__
是明确的。但我听说 的主要目的__repr__
是生成一个字符串,以便eval()
以后可以重建 python 对象。其实主要目的是__repr__
什么?python中的任何内置函数或任何默认模块是否固有地__repr__
用于重建对象?__repr__
如果我们只是覆盖它以使其总是返回一个常量字符串(例如“foo”),它会搞乱执行吗?
2 回答
对于具有文字表示法(str
、int
、float
、list
等)的类型,repr()
返回一个可用于再次创建该类型的字符串。
这很好,但不是必需的。
的主要目的__repr__
是为开发人员提供关于他们在这里拥有什么对象的明确信息,以用于调试目的。
引用__repr__
文档:
由
repr()
内置函数调用以计算对象的“官方”字符串表示。如果可能的话,这应该看起来像一个有效的 Python 表达式,可用于重新创建具有相同值的对象(给定适当的环境)。如果这不可能,<...some useful description...>
则应返回表单的字符串。
但最重要的是:
这通常用于调试,因此表示信息丰富且明确是很重要的。
强调我的。
从您的自定义类型返回一个常量字符串在技术上不会破坏任何东西,但会使您作为开发人员的生活更加艰难。
约定是您repr
用来获取表示对象的字符串并str
对其进行描述。repr
更多地用于调试,str
用于常规打印。这个想法是 repr 的输出看起来像你可以评估的代码,而且通常是这样。但是,您不能依赖它。如果您必须将对象转换为字符串并返回,请使用pickle
or 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)>'