__repr__ 方法的作用是什么?

192 投票
6 回答
215867 浏览
提问于 2025-04-15 17:30
def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

这个方法有什么重要性或者目的呢?

6 个回答

20

__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__ 方法。


文档链接,请查阅

23

Python文档中,这个内容解释得很清楚:

repr(对象): 返回一个字符串,这个字符串是对象的可打印表示。这个值和通过转换(反引号)得到的值是一样的。有时候,作为一个普通函数来使用这个操作是很有用的。对于很多类型,这个函数会尝试返回一个字符串,当这个字符串传给eval()时,会得到一个值相同的对象。否则,返回的字符串会用尖括号括起来,里面包含对象的类型名称和一些额外信息,通常还包括对象的名称和地址。一个类可以通过定义__repr__()方法来控制它的实例返回什么。

所以你看到的就是__repr__的默认实现,这在序列化和调试时非常有用。

233

__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)

撰写回答