__repr__ 方法的目的?

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

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

205765 次浏览

这在 Python 文档中得到了很好的解释:

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

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

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

不,不,不,不,不,不,不,不,不方法只是告诉 Python 如何打印类的对象

独立的 Python 解释器使用 __repr__以可打印格式显示类:

~> 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()ing 类将调用 __str__


文件 ,如果可以的话

一个示例来查看它们之间的差异(我是从 这个来源复制的) ,

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'

对于 int xrepr()str()的返回值是相同的,但是对于 str y,返回值之间存在差异——一个是 正式的,另一个是 非正式的。正式表示和非正式表示之间最重要的区别之一是,str 值的 __repr__默认实现可以作为 eval 的参数调用,而返回值将是一个有效的字符串对象,如下所示:

>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

如果尝试调用 __str__的返回值作为 eval 的参数,结果将是无效的。

对每个实现的类实现 公司代表。不应该有任何借口。 对于那些您认为可读性对于非歧义性更为重要的类,实现 STR

请参考此链接: https://www.pythoncentral.io/what-is-the-difference-between-str-and-repr-in-python/