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__()的目的是生成可打印的字符串表示形式,该表示形式本质上是非正式的,本质上是人类可读的。