点滴 | __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
是相等的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!