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))
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录