def __repr__(self):
return '<%s %s (%s:%s) %s>' % (
self.__class__.__name__, self.urlconf_name, self.app_name,
self.namespace, self.regex.pattern)
这种方法的意义/目的是什么?
答案 0 :(得分:156)
__repr__
应该返回对象的可打印表示,很可能是一个创建此对象的方式。参见官方文档here。 __repr__
更适合开发人员,__str__
适用于最终用户。
一个简单的例子:
>>> class Point:
... def __init__(self, x, y):
... self.x, self.y = x, y
... def __repr__(self):
... return 'Point(x=%s, y=%s)' % (self.x, self.y)
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)
答案 1 :(得分:15)
repr(object):返回包含对象的可打印表示的字符串。这与转换(反向引号)产生的值相同。能够以普通函数的形式访问此操作有时很有用。对于许多类型,此函数尝试返回一个字符串,该字符串在传递给eval()时会产生具有相同值的对象,否则表示形式是一个用尖括号括起来的字符串,它包含对象类型的名称附加信息通常包括对象的名称和地址。类可以通过定义__repr __()方法来控制此函数为其实例返回的内容。
所以你在这里看到的是__repr__的默认实现,这对序列化和调试很有用。
答案 2 :(得分:10)
__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()
该课程默认会调用__str__
。
Documentation,如果您愿意
答案 3 :(得分:5)
__ repr __ 方法只是告诉Python如何打印类的对象
答案 4 :(得分:0)
查看它们之间差异的示例(我从this source复制),
select nullable from user_tab_columns where table_name = 'MYTABLE1' and column_name = 'COLUMN_VALUE';
>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'
和repr()
的返回对于str()
是相同的,但是int x
str
的返回值之间是有区别的-一个是< em>正式,另一个是非正式。形式表示和非正式表示之间最重要的区别之一是,可以将y
的str值的默认实现称为eval的参数,而返回值将是有效的字符串对象,如下所示:
__repr__
如果您尝试将返回>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True
的返回值作为eval的参数,则结果将无效。
答案 5 :(得分:0)
当我们通过定义类创建新类型时,我们可以利用Python的某些功能使新类易于使用。这些功能之一就是“特殊方法”,也称为“魔术方法”。
特殊方法的名称以两个下划线开头和结尾。我们定义它们,但通常不直接按名称调用它们。相反,它们会在特定情况下自动执行。
使用打印语句能够输出对象实例的值很方便。当我们这样做时,我们希望该值以某种可以理解的明确格式表示在输出中。 repr 特殊方法可用于安排这种情况的发生。如果定义此方法,则在打印为其定义了该方法的类的实例的值时可以自动调用它。不过,应该提到的是,还有一个 str 特殊方法,用于相似但不相同的目的,如果我们也定义了它,则它可能会优先。
如果尚未定义Point3D类的 repr 方法,并将my_point实例化为Point3D的实例,然后执行此操作...
打印my_point ...我们可能会将其视为输出...
不是很好,是吗?
因此,我们定义 repr 或 str 特殊方法,或同时使用这两种方法,以获得更好的输出。
**class Point3D(object):
def __init__(self,a,b,c):
self.x = a
self.y = b
self.z = c
def __repr__(self):
return "Point3D(%d, %d, %d)" % (self.x, self.y, self.z)
def __str__(self):
return "(%d, %d, %d)" % (self.x, self.y, self.z)
my_point = Point3D(1, 2, 3)
print my_point # __repr__ gets called automatically
print my_point # __str__ gets called automatically**
输出...
(1、2、3) (1,2,3)
答案 6 :(得分:0)
为您实施的每个类实施 repr 。不应有任何借口。 为您认为易读性比非歧义性更重要的类实现 str 。
请参考以下链接:https://www.pythoncentral.io/what-is-the-difference-between-str-and-repr-in-python/