Python中__str__和__repr_之间有什么区别?


当前回答

除了给出的所有答案外,我想补充几点:-

1) 当您只需在交互式python控制台上写入对象名称并按enter键时,就会调用__repr_()。

2) __str__()在使用带有print语句的对象时被调用。

3) 在这种情况下,如果缺少__str__,那么print和任何使用str()的函数都会调用对象的__repr_()。

4) 容器的__str__(),当调用时将执行其包含元素的__repr_()方法。

5) 在__str__()内调用的str()可能会在没有基本情况的情况下递归,并且在最大递归深度上出错。

6) __repr_()可以调用repr(),它将尝试自动避免无限递归,用…替换已经表示的对象。。。。

其他回答

来自effbot的(非官方)Python参考Wiki(存档副本):

__str__“计算对象的“非正式”字符串表示。这与__repr_不同,因为它不必是有效的Python表达式:可以使用更方便或更简洁的表示。”

我的经验法则是:__repr_面向开发者,__str__面向客户。

其他答案中缺少的一个方面。的确,一般来说,模式是:

__str__的目标:人类可读__repr_的目标:明确,可能通过eval机器可读

不幸的是,这种区别是有缺陷的,因为Python REPL和IPython都使用__repr_在REPL控制台中打印对象(请参见Python和IPython的相关问题)。因此,以交互控制台工作为目标的项目(例如,Numpy或Pandas)已经开始忽略上述规则,转而提供一个人类可读的__repr_实现。

>>> print(decimal.Decimal(23) / decimal.Decimal("1.05"))
21.90476190476190476190476190
>>> decimal.Decimal(23) / decimal.Decimal("1.05")
Decimal('21.90476190476190476190476190')

当对decimal.decimal(23)/decimal.Ddecimal(“1.05”)的结果调用print()时,将打印原始数字;此输出为字符串形式,可以使用__str__()实现。如果我们简单地输入表达式,我们会得到一个decimal.decimal输出-这个输出是以表示形式的,可以用__repr_()实现。所有Python对象都有两种输出形式。字符串形式设计为人类可读。表示形式被设计为生成输出,如果将其提供给Python解释器,将(在可能的情况下)再现所表示的对象。

优秀的答案已经涵盖了__str__和__repr_之间的差异,对我来说,这归结为前者即使是最终用户也可以阅读,后者对开发人员尽可能有用。考虑到这一点,我发现__repr_的默认实现常常无法实现这一目标,因为它忽略了对开发人员有用的信息。

出于这个原因,如果我有一个足够简单的__str__,我通常只会尝试通过以下方式来达到两全其美:

def __repr__(self):
    return '{0} ({1})'.format(object.__repr__(self), str(self))