repr() vs str() in Python
2023-09-20 09:32:39
object
类是所有类的基类,具有许多 dunder(双下划线的缩写)方法。
它们通常被称为 magic methods .
这些方法永远不会直接调用。相反,相应的内置函数在内部调用这些魔术方法之一。例如,内置str()函数调用__str__()
方法,repr()函数调用__repr__()
方法。
>>> x=100
>>> print(str(x))
100
>>> print(x.__str__())
100
下面调用repr()
和__repr__()
方法:
>>> x=100
>>> print(repr(x))
100
>>> print(x.__repr__())
100
显然,__str__()
的行为和__repr__()
的行为似乎没有区别。但是,如果我们采用字符串对象,差异将是显而易见的。
>>> x="Hello World"
>>> print(x.__str__())
Hello World
>>> print(x.__repr__())
'Hello World'
__repr__()
的输出用引号引起来,而__str__()
的输出则不是。原因可以追溯到这些函数的官方定义,它说__repr__()
方法,因此 (repr() 函数)计算对象的官方字符串表示。str() 函数,即 __str__()
方法返回相关对象的非正式或可打印字符串表示形式,由 print()
和 format()
函数使用。
如果尝试使用任何用户定义类的对象作为 print()
函数的参数,它将使用对象类的默认__str__()
方法。
除了 id 之外,它不会告知对象的任何有意义的信息。
class myclass:
def __init__(self):
self.name="Raj"
self.age=21
obj = myclass()
print(obj)
输出:
<__main__.myclass object at 0x000001E06B3ADE08>
然而,我们希望获得显示对象属性值的字符串表示。
这可以通过覆盖myclass
中的__str__()
方法来完成,如下所示。
class myclass:
def __init__(self):
self.name="Raj"
self.age=21
def __str__(self):
return "name : {} age : {}".format(self.name, self.age)
obj=myclass()
print(obj)
print(str(obj))
输出:
name : Raj age : 21
name : Raj age : 21
请注意,str() 函数在类中使用了__str__()
方法。__repr__()
方法也可以用于相同的目的。但是 str() 函数默认使用 __str__()
,如果没有找到,则使用 __repr__()
。
两者之间的另一个区别是,__str__()
应始终返回一个字符串,而__repr__()
可以返回任何有效的 Python 表达式。
让我们在 myclass 中添加这两个方法,以便__repr__()
返回一个 dict 对象。
class myclass:
def __init__(self):
self.name="Raj"
self.age=21
def __str__(self):
return "name : {} age : {}".format(self.name, self.age)
def __repr__(self):
return {"name":self.name, "age":self.age}
obj = myclass()
print(obj.__str__())
print(obj.__repr__())
输出:
name : Raj age : 21
{'name': 'Raj', 'age': 21}
现在,这将带出两者之间的确切区别。虽然str()
正确地实现了__str__()
,但repr()函数会抛出TypeError
,因为它需要返回一个字符串__repr__()
。
print(str(obj))
print(repr(obj))
输出:
name : Raj age : 21
TypeError: __repr__ returned non-string (type dict)
__repr__()
方法的输出主要是机器可读的,主要用于调试目的。因此,希望提供对象的明确表示。
__str__()
的目的是生成可打印的字符串表示形式,该表示形式本质上是非正式的,本质上是人类可读的。