`__repr__`函数对正常函数的意义是什么?

jax*_*jax 6 python python-2.7

我正在尝试用我自己学习python而且我坚持使用__repr__函数.虽然我已经阅读了很多帖子__repr__以及python文档.所以我决定在这里提出这个问题.下面的代码解释了我的困惑.

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)

    def print_class(self):
        return 'Point(x=%s, y=%s)'%(self.x, self.y)



p = Point(1,2)

print p
print p.print_class()


Point(x=1, y=2)
Point(x=1, y=2)
Run Code Online (Sandbox Code Playgroud)

如果正常函数也可以执行类似的任务,那么__repr__结束print_class()(在我的情况下是正常函数)函数的额外优势是什么.

Ana*_*mar 5

__repr__函数由repr()内部调用.repr()在直接打印对象时调用,而类没有定义__str__().从文档 -

对象.__再版__(个体)

由repr()内置函数和字符串转换(反向引号)调用,以计算对象的"官方"字符串表示形式.如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象(给定适当的环境).如果这不可能,则应返回<...一些有用的描述...>形式的字符串.返回值必须是字符串对象.如果类定义__repr__()但未定义__str__(),则__repr__()在需要该类的实例的"非正式"字符串表示时也使用.

在您的情况下print_class() ,您必须在打印对象时专门调用该方法.但在这种情况下__repr__(),它会被内部调用print.

当您混合不同的类/类型时,这尤其有用.例如,我们可以列出一个可以包含类的数字和对象的列表point,现在要打印列表的元素.

如果您没有定义__repr__()__str__(),则必须首先检查实例,Point如果是这样调用它的类型print_class(),或者如果不是直接打印该数字.

但是当你的类定义了__repr__()or时__str__(),你可以直接调用print列表的所有元素,print语句将在内部负责打印正确的值.

示例,让我们假设一个类有print_class()方法,但没有__repr__()__str__()代码 -

>>> class CA:
...     def __init__(self,x):
...             self.x = x
...     def print_class(self):
...             return self.x
...
>>> l = [1,2,3,CA(4),CA(5)]
>>> for i in l:
...     print(i)
...
1
2
3
<__main__.CA object at 0x00590F10>
<__main__.CA object at 0x005A5070>
SyntaxError: invalid syntax
>>> for i in l:
...     if isinstance(i, CA):
...             print(i.print_class())
...     else:
...             print(i)
...
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,当我们CA在列表中混合数字和类型的对象时,然后当我们刚刚执行时print(i),它不会打印出我们想要的内容.为了正常工作,我们必须检查类型i并调用适当的方法(如第二种情况所做).

现在让我们假设一个实现的类__repr__()而不是print_class()-

>>> class CA:
...     def __init__(self,x):
...             self.x = x
...     def __repr__(self):
...             return str(self.x)
...
>>>
>>> l = [1,2,3,CA(4),CA(5)]
>>> for i in l:
...     print(i)
...
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

正如你在第二种情况下所看到的那样,简单的打印工作,因为print内部调用是__str__()第一次,并且因为不存在而回落__repr__().

不仅如此,当我们这样做时str(list),内部每个列表的元素都__repr__()被调用.示例 -

第一种情况(没有__repr__()) -

>>> str(l)
'[1, 2, 3, <__main__.CA object at 0x005AB3D0>, <__main__.CA object at 0x005AB410>]'
Run Code Online (Sandbox Code Playgroud)

第二种情况(附__repr__()) -

>>> str(l)
'[1, 2, 3, 4, 5]'
Run Code Online (Sandbox Code Playgroud)

此外,在交互式解释器中,当您直接使用该对象时,它会显示repr()函数的输出,示例 -

>>> class CA:
...     def __repr__(self):
...             return "CA instance"
...
>>>
>>> c = CA()
>>> c
CA instance
Run Code Online (Sandbox Code Playgroud)