点滴 | __str__ 方法和 __repr__ 方法的区别
你可能会经常看到这样的写法:
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 是相等的。

浙公网安备 33010602011771号