__repr__方法的目的是什么?

190
def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

这个方法的意义/目的是什么?


4
可能是Python中__str__和__repr__的区别的重复问题。 - Vlad Bezden
4
对于正在学习Python的Java开发人员来说,最好的理解方法是将其视为Java中的toString()方法。 - Ravi
6个回答

231

__repr__应该返回一个可打印的对象表示,很可能是创建这个对象的一种方式。请参阅官方文档此处__repr__更适用于开发人员,而__str__则适用于最终用户。

一个简单的例子:

>>> class Point:
...     def __init__(self, x, y):
...             self.x, self.y = x, y
...     def __repr__(self):
...             cls = self.__class__.__name__
...             return f'{cls}(x={self.x!r}, y={self.y!r})'
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)

2
lazy1: 我主要想修复格式(让示例尽可能与样本会话匹配非常有用),但我还调整了输出格式,以明确与任务不同,因为这对于那些对此感到困惑的人来说极大地提高了清晰度,我认为。(如果我做得太过头了,请重新编辑,我会请你喝一杯啤酒。) - Roger Pate
2
省略参考链接:http://docs.python.org/reference/datamodel.html#object.__repr__请返回翻译后的文本。 - S.Lott
1
这个可能应该使用%r而不是%s:https://dev59.com/questions/dG025IYBdhLWcg3wblg3 - Jonathan Adelson
54
这并不完全正确。 _str__是应该可读性良好的输出:__repr__应该是供Python解释器阅读的表示(即将字符串提供给解释器应该重新创建对象)。但是,如果一个对象没有__str__方法,那么会使用__repr__代替。另外需要注意的是:这个示例实际上打印了self.xself.y__str__方法:在字符串格式化操作中应该使用%r而不是%s(由于类未定义__str__,因此实际上返回的是__repr__,但这是一种异常情况)。 - Daniel Andersson
2
每个类在Python中都实现了repr吗? - Charlie Parker
显示剩余2条评论

23

Python文档中,对此进行了很好的解释:

repr(对象):返回一个包含对象可打印表示的字符串。这个值与反引号转换所产生的值相同。有时,能够将此操作作为普通函数访问非常有用。对于许多类型,此函数会尝试返回一个字符串,该字符串在传递给eval()时产生一个具有相同值的对象。否则,表示形式是一个带有角括号的字符串,其中包含对象类型的名称和附加信息,通常包括对象的名称和地址。通过定义__repr__()方法,类可以控制此函数返回其实例的内容。

因此,您在这里看到的是__repr__的默认实现,它对序列化和调试非常有用。


6
我认为使用反引号(或称“backticks”)来获取对象的“表示形式”的方法已不推荐使用,并已在3.0版本中被移除。 - Tyler
MatrixFrog:两者都是正确的,但当前的2.x文档仍然这样说,这也是引用的来源。 - Roger Pate
对于许多对象,_ \ repr \ \ str \ 是相同的函数。实际上,如果您只定义了 \ str \ ,那么 \ repr \ 默认为仅调用 \ str \ _。这不成立的最明显的情况是字符串本身:str('stackoverflow')返回stackoverflow,但repr('stackoverflow')是'stackoverflow' - Tyler
7
你的理解是相反的,__repr__从不使用__str__,但相反的情况可能发生。请参阅http://docs.python.org/reference/datamodel.html#object.%5F%5Frepr%5F%5F。 - Roger Pate

19

__repr__ 用于在独立的 Python 解释器中以可打印的格式显示类。例如:

~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
...     def __init__(self):
...         pass
...     def __repr__(self):
...         return '<StackOverflow demo object __repr__>'
... 
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>

在类中未定义__str__方法的情况下,它将调用__repr__函数来尝试创建可打印的表示形式。
>>> str(demo)
'<StackOverflow demo object __repr__>'

此外,对类进行print()操作将默认调用__str__函数。

文档, 如果您愿意的话


6
__repr__ 方法只是告诉 Python 如何打印一个类的对象。

3
这不是真的。这就是__str__存在的原因。 - nbro

3

以下是一个例子,可以看到它们之间的区别(我从这个来源复制),

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'
repr()str()对于int x的返回值是相同的,但对于str y的返回值却有所不同——一个是正式的,另一个是非正式的。正式和非正式表示之间最重要的差异之一是,对于str值的__repr__默认实现可以作为eval的参数调用,并且返回值将是一个有效的字符串对象,如下所示:
>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

如果您试图将__str__的返回值作为eval函数的参数进行调用,则结果将无效。

-1

真的吗??命令别人做什么?凭谁的权威?只要说明一个实践为什么是好的就可以了。这里的人们可以根据自己特定的情况自行决定什么对他们最优。 - Jim Ratliff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接