Python的目的__repr__

时间:2009-12-31 06:06:40

标签: python

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

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

7 个答案:

答案 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)

这在Python documentation

中得到了很好的解释
  

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

所以你在这里看到的是__repr__的默认实现,这对序列化和调试很有用。

答案 2 :(得分:10)

独立的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()该课程默认会调用__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/