背景
"Difference between str and repr in Python"(stackoverflow.com/questions/1… 是 Stack Overflow 上的一个问题。
在此,笔者将从代码 & 语法两个层次,进行分析。
代码浅析
class Test(object): pass
test = Test()
str(test) # <__main__.Test object at 0x108ff4f28>
repr(test) # <__main__.Test object at 0x108ff4f28>
class Repr(object):
def __repr__(self):
return '__repr__'
r = Repr()
str(r) # '__repr__'
repr(r) # '__repr__'
class Str(object):
def __str__(self):
return '__str__'
s = Str()
str(s) # '__str__'
repr(s) # '<__main__.Str object at 0x109170898>'
复制代码
由以上代码,可以看出来:如果你覆盖了 __repr__ 方法,__str__ 也适用,但反之亦然。
语法浅析
repr(object)
返回包含一个对象的可打印表示形式的字符串。
类可以通过定义 __repr__() 方法来控制此函数为它的实例所返回的内容。
object.__repr__(self)
由 repr() 内置函数调用以输出一个对象的'官方'字符串表示。
此方法通常被用于调试。面向程序员
str(object='')
返回 object 的字符串版本。即返回 object.__str__()。
如果 object 没有 __str__ 方法,则返回 repr(object)。
object.__str__(self)
通过 str(object) 以及内置函数 format() 和 print() 的调用,生成一个对象的字符串表示。
返回值必须是字符串对象
内置类型 object 所定义的默认实现会调用 object.__repr__()。
复制代码
由以上可知:
- __repr__ 适用于开发调试
- __str__ 适用于用户(例如:输出、format()、print())
- object.__str__ 会调用 object.__repr__
总结
如果你只想实现两个特殊方法中的一个,__repr__ 是更好的选择,因为如果一个对象没有 __str__ 函数,而 Python 又需要调用它的时候,解释器会用 __repr__ 作为代替。