点滴 | __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 是相等的。

posted @ 2024-04-24 09:53  kingron  阅读(1)  评论(0编辑  收藏  举报