__str__和__repr__之间的区别?

Bla*_*mba 8 python

我写这段代码:

class Item:
    def __init__(self, name):
        self._name = name;
    def __str__(self):
        return "Item: %s" % self._name
Run Code Online (Sandbox Code Playgroud)

我跑的时候

print((Item("Car"),))
Run Code Online (Sandbox Code Playgroud)

输出是

(<__main__.Item object at 0x0000000002D32400>,)
Run Code Online (Sandbox Code Playgroud)

当我将代码更改为:

class Item:
    def __init__(self, name):
        self._name = name;
    def __repr__(self):
        return "Item: %s" % self._name
    def __str__(self):
        return "Item: %s" % self._name
Run Code Online (Sandbox Code Playgroud)

然后输出

(Item: Car,)
Run Code Online (Sandbox Code Playgroud)

所以,现在我感到困惑的区别__repr____str__.

Tay*_*mon 17

__str__并且__repr__都是获取对象的字符串表示的方法.__str__应该更短,更人性化,同时__repr__应该提供更多的细节.

具体来说,对于许多数据类型,__repr__返回一个字符串,如果将其粘贴回Python,则该字符串将是一个有效的表达式,其值将等于原始值.例如,str('Hello')返回'Hello',但repr('Hello')返回"'Hello'",在字符串内带引号.如果你打印出那个字符串,你就会得到'Hello',如果你把它粘贴到Python中,你就会得到原来的字符串.

某些数据类型(如文件对象)无法以这种方式转换为字符串.__repr__此类对象的方法通常在尖括号中返回一个字符串,其中包含对象的数据类型和内存地址.如果您没有专门定义__repr__方法,用户定义的类也会执行此操作.

在REPL中计算值时,Python调用__repr__将其转换为字符串.print但是,当您使用Python调用时__str__.

当你调用时print((Item("Car"),)),你正在调用类的__str__方法tuple,这与它的__repr__方法相同.该方法通过调用__repr__元组中每个项目的方法,将它们与逗号连接在一起(加上一个项目元组的尾随),并用括号括起整个事物.我不确定为什么这个__str__方法tuple不会调用__str__它的内容,但事实并非如此.