你可能会经常看到这样的写法:
class SomeClass(object):
def __str__(self):
return '...'
__repr__ = __str__
你可能会想,__repr__
是什么,谁会去调用它,既然和 __str__
一样的话,为什么还需要单独定义呢。
我们来看下官方给出的定义:
object._repr_(self)
由
repr()
内置函数调用以输出一个对象的“官方”字符串表示。如果可能,这应类似一个有效的 Python 表达式,能被用来重建具有相同取值的对象(只要有适当的环境)。如果这不可能,则应返回形式如<...some useful description...>
的字符串。返回值必须是一个字符串对象。如果一个类定义了__repr__()
但未定义__str__()
,则在需要该类的实例的“非正式”字符串表示时也会使用__repr__()
。此方法通常被用于调试,因此确保其表示的内容包含丰富信息且无歧义是很重要的。object._str_(self)
通过
str(object)
以及内置函数format()
和print()
调用以生成一个对象的“非正式”或格式良好的字符串表示。返回值必须为一个 字符串 对象。此方法与object.__repr__()
的不同点在于__str__()
并不预期返回一个有效的 Python 表达式:可以使用更方便或更准确的描述信息。内置类型object
所定义的默认实现会调用object.__repr__()
。
也就是说,__repr__
表示了对象怎么生成的,它应该尽可能返回一个可以直接用来构建对象的表达式(字符串类型),而 __str__
则表示对象是什么,返回让人容易理解这个对象的性质的字符串。
以标准库 datetime
为例:
In [1]: import datetime
In [2]: now = datetime.datetime.now()
In [3]: str(now)
Out[3]: '2024-04-24 09:35:01.242094'
In [4]: repr(now)
Out[4]: 'datetime.datetime(2024, 4, 24, 9, 35, 1, 242094)'
In [5]: datetime.datetime(2024, 4, 24, 9, 35, 1, 242094) == now
Out[5]: True
可以看到,通过 str
调用的 now
对象,得到的是一个明显的带有年月日时分秒信息的时间字符串,而通过 repr
调用的 now
对象,会直接生成一个构造对象的表达式,通过该表达式构造出来的对象与 now
是相等的。