3

我刚刚遇到了这个问题Python 之间的区别__str____repr__它提到的主要目的__repr__是明确的。但我听说 的主要目的__repr__是生成一个字符串,以便eval()以后可以重建 python 对象。其实主要目的是__repr__什么?python中的任何内置函数或任何默认模块是否固有地__repr__用于重建对象?__repr__如果我们只是覆盖它以使其总是返回一个常量字符串(例如“foo”),它会搞乱执行吗?

4

2 回答 2

7

对于具有文字表示法(strintfloatlist等)的类型,repr()返回一个可用于再次创建该类型的字符串。

很好,但不是必需的。

的主要目的__repr__是为开发人员提供关于他们在这里拥有什么对象的明确信息,以用于调试目的。

引用__repr__文档

repr()内置函数调用以计算对象的“官方”字符串表示。如果可能的话,这应该看起来像一个有效的 Python 表达式,可用于重新创建具有相同值的对象(给定适当的环境)。如果这不可能,<...some useful description...>则应返回表单的字符串。

但最重要的是:

这通常用于调试,因此表示信息丰富且明确是很重要的。

强调我的。

从您的自定义类型返回一个常量字符串在技术上不会破坏任何东西,但会使您作为开发人员的生活更加艰难

于 2013-03-27T14:16:13.070 回答
2

约定是您repr用来获取表示对象的字符串并str对其进行描述。repr更多地用于调试,str用于常规打印。这个想法是 repr 的输出看起来像你可以评估的代码,而且通常是这样。但是,您不能依赖它。如果您必须将对象转换为字符串并返回,请使用pickleor 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)>'
于 2013-03-27T14:30:55.500 回答