__repr__ 方法的目的?
- 2025-01-08 08:50:00
- admin 原创
- 80
问题描述:
def __repr__(self):
return '<%s %s (%s:%s) %s>' % (
self.__class__.__name__, self.urlconf_name, self.app_name,
self.namespace, self.regex.pattern)
这个方法的意义/目的是什么?
解决方案 1:
__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:
Python 文档对此进行了很好的解释:
repr ( object ):返回一个包含对象可打印表示形式的字符串。这与转换(反向引号)产生的值相同。有时能够将此操作作为普通函数访问很有用。对于许多类型,此函数尝试返回一个字符串,该字符串将产生一个与传递给时具有相同值的对象
eval()
,否则表示形式是一个用尖括号括起来的字符串,其中包含对象类型的名称以及其他信息,通常包括对象的名称和地址。类可以通过定义__repr__()
方法来控制此函数为其实例返回的内容。
所以您在这里看到的是的默认实现__repr__
,它对于序列化和调试很有用。
解决方案 3:
__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__
默认调用。
文档,如果你愿意的话
解决方案 4:
repr方法只是告诉 Python 如何打印某个类的对象
解决方案 5:
举个例子来看一下它们之间的区别(我从这个来源复制而来),
>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'
repr()
对于 来说,和 的返回值str()
相同int x
,但是 的返回值之间存在差异str
y
——一个是正式的,另一个是非正式的。正式表示和非正式表示之间最重要的区别之一是,__repr__
str 值的 默认实现可以作为 eval 的参数调用,并且返回值将是一个有效的字符串对象,如下所示:
>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True
如果您尝试将其返回值__str__
作为 eval 的参数调用,则结果将无效。
解决方案 6:
为每个实现的类实现repr。不应该有任何借口。为你认为可读性比非歧义性更重要的类实现str 。
参考此链接: https: //www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python/