python中__str__和__repr__区别

MicLon原创2022年11月25日
大约 2 分钟

简介

在python中,__str____repr__均为类的魔术方法,也就意味着,它会在指定的场景下才会被自动调用。但是这两者经常会傻傻分不清楚,接下来结合测试和场景来更深入的理解这两个魔术方法。

何时触发

__str__

官方open in new window说法解析:

  • __str__是在str(object)、format()、print()object.__str__等场景下被调用。
  • 返回值必须是字符串,它不应当是一个Python表达式,而是应该是一个可读且简洁的字符串。

核心:__str__返回的是一个简洁可读的字符串。

__repr__

官方open in new window说法解析:

  • __repr__是在repr(object)和控制台输出等场景下被调用。
  • 它看起来是一个有效的python表达式。(下文讨论)
  • 如果不能是表达式,那应当返回<类的可读描述>形式的字符串
  • 如果定义了__repr__但是没定义__str__,则会去调用__repr__
  • 通常用于调试。

核心:__repr__返回的是一个python表达式或者<类的可读描述>

演示代码:

应用场景

其实大部分应用场景应当结合实际情况。

为了直观表述,不妨看看官方模块是如何来编写的。

datetime

import datetime

print(str(datetime.datetime.now()))  # 2022-11-25 10:42:22.833073
print(repr(datetime.datetime.now()))  # datetime.datetime(2022, 11, 25, 10, 42, 22, 833112)

datetime模块中,领悟__str____repr__的区别。

__str__获得了良好且可读的输出:2022-11-25 10:42:22.833073

__repr__获得了python表达式,你可以将此表达式复制后运行。

datetime.datetime(2022, 11, 25, 10, 42, 22, 833112).year  # 2022

threading

from threading import Thread

print(str(Thread()))    # <Thread(Thread-1, initial)>
print(repr(Thread()))   # <Thread(Thread-2, initial)>

这和datetime有所不同,Thread类中并未实现__str__,所以当str()调用后,会默认调用__repr__

而Thread无法提供一个有效的python表达式,所以使用两个尖括号用于表述:这是线程类(Thread),当前线程的数量(1/2)和当前线程的状态(initial)

Loading...