Python中__str__和__repr_之间有什么区别?
当前回答
简单地说:
__str__用于显示对象的字符串表示形式,以便其他人轻松读取。
__repr_用于显示对象的字符串表示。
假设我想创建一个分数类,其中分数的字符串表示为“(1/2)”,对象(分数类)表示为“分数(1,2)”
因此,我们可以创建一个简单的Fraction类:
class Fraction:
def __init__(self, num, den):
self.__num = num
self.__den = den
def __str__(self):
return '(' + str(self.__num) + '/' + str(self.__den) + ')'
def __repr__(self):
return 'Fraction (' + str(self.__num) + ',' + str(self.__den) + ')'
f = Fraction(1,2)
print('I want to represent the Fraction STRING as ' + str(f)) # (1/2)
print('I want to represent the Fraction OBJECT as ', repr(f)) # Fraction (1,2)
其他回答
来自effbot的(非官方)Python参考Wiki(存档副本):
__str__“计算对象的“非正式”字符串表示。这与__repr_不同,因为它不必是有效的Python表达式:可以使用更方便或更简洁的表示。”
除了给出的所有答案外,我想补充几点:-
1) 当您只需在交互式python控制台上写入对象名称并按enter键时,就会调用__repr_()。
2) __str__()在使用带有print语句的对象时被调用。
3) 在这种情况下,如果缺少__str__,那么print和任何使用str()的函数都会调用对象的__repr_()。
4) 容器的__str__(),当调用时将执行其包含元素的__repr_()方法。
5) 在__str__()内调用的str()可能会在没有基本情况的情况下递归,并且在最大递归深度上出错。
6) __repr_()可以调用repr(),它将尝试自动避免无限递归,用…替换已经表示的对象。。。。
__repr_:python对象的表示通常eval会将其转换回该对象
__str__:是你认为的文本形式的对象
e.g.
>>> s="""w'o"w"""
>>> repr(s)
'\'w\\\'o"w\''
>>> str(s)
'w\'o"w'
>>> eval(str(s))==s
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
w'o"w
^
SyntaxError: EOL while scanning single-quoted string
>>> eval(repr(s))==s
True
摘自《流利的Python》一书:
Python对象的基本要求是提供可用的自身的字符串表示,用于调试和日志记录,另一个用于向最终用户演示。这就是为什么数据模型中存在特殊的方法repr_和str__。
Hans Petter Langtanch的《Python脚本用于计算科学》一书第358页明确指出
__repr_的目标是对象的完整字符串表示;__str__是返回一个用于打印的字符串。
所以,我更愿意把他们理解为
repr=再现str=字符串(表示)
从用户的角度来看尽管这是我在学习python时产生的误解。
同一页还提供了一个小但很好的示例,如下所示:
实例
In [38]: str('s')
Out[38]: 's'
In [39]: repr('s')
Out[39]: "'s'"
In [40]: eval(str('s'))
Traceback (most recent call last):
File "<ipython-input-40-abd46c0c43e7>", line 1, in <module>
eval(str('s'))
File "<string>", line 1, in <module>
NameError: name 's' is not defined
In [41]: eval(repr('s'))
Out[41]: 's'
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用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中获得所有直接子目录