python中的str()和repr()方法都用于字符串的字符串表示。尽管它们看起来都服务于相同的目的,但是它们之间还是有一点差异。
您是否曾经注意到当调用python内置函数str(x)时会发生什么,其中x是您想要的任何对象?str(x)的返回值取决于两种方法:__str__是默认选择,__repr__作为后备。
首先让我们看看python文档对它们的评价-
>>> help(str) Help on class str in module builtins: class str(object) | str(object='') -> str | str(bytes_or_buffer[, encoding[, errors]]) -> str | | Create a new string object from the given object. >>> help(repr) Help on built-in function repr in module builtins: repr(obj, /) Return the canonical string representation of the object. For many object types, including most builtins, eval(repr(obj)) == obj.
现在让我们尝试使用几个示例来了解这两种方法
>>> str(123) '123' >>> repr(123) '123' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str('Python') 'Python' >>> repr('Python') "'Python'"
repr()和str()的返回值对于整数值是相同的,但是字符串的返回值之间是有区别的-一个是正式的,另一个是非正式的。
现在,如果您查看官方的python文档-__str__用于查找对象的“非正式”(可读)字符串表示形式,而__repr__用于查找对象的“正式”字符串表示形式。
正式表示和非正式表示之间的区别在于,可以将str值的__repr__的默认实现称为eval的参数,而返回值将是有效的字符串对象。此函数(repr())接受一个字符串,并将其内容评估为python代码。
因此,当我们将“ Python”传递给它时,它就起作用了。但是,“ Python”会导致错误,原因是它被解释为变量Python,这当然是未定义的。以下是了解它的代码-
>>> x = "Python" >>> repr(x) "'Python'" >>> x1 = eval (repr(x)) >>> x == x1 True
因此,如果我们尝试将__str__的返回值作为eval的参数来调用,它将失败。
>>> y = "Python" >>> str(y) 'Python' >>> y1 = eval(str(y)) Traceback (most recent call last): File "<pyshell#51>", line 1, in <module> y1 = eval(str(y)) File "<string>", line 1, in <module> NameError: name 'Python' is not defined
另一个展示两者之间差异的例子是-
>>> import datetime >>> now = datetime.datetime.now() >>> str(now) '2019-03-29 01:29:23.211924' >>> repr(now) 'datetime.datetime(2019, 3, 29, 1, 29, 23, 211924)'
在上面的输出中,str(now)计算一个包含now值的字符串,而repr(now)再次返回重建我们now对象所需的python代码。
str() | repr() |
---|---|
使对象可读 | 复制对象的必需代码 |
生成输出给最终用户 | 为开发人员生成输出 |
在为类编写__str__和__repr__时,需要考虑以上几点。