Python 的 __str__ 和 __repr__ 方法对比


Posted in Python onSeptember 02, 2020

阅读到 Strings 中关于转换对象为字符串的内容,介绍了 repr 函数,趁着还没有真正了解 Python 面向对象的生疏与热度,感性上理解一下 reprstr 这两个函数的区别。

Python 的全局方法 reprstr 会映射到对象的 __repr__ 和 __str__ 的方法调用,还有 str(obj) 时会调用哪个方法,以及 print(obj) 和调试 Python 代码时的对象显示会调用哪个方法呢?这就是本文想要印证的内容。

恰如 Java 的 System.out.println(obj) "hello" + obj 都会调用 Java 对象的 toString() 方法,那么 Python 中是怎么一回事呢?

来自某本 Python 入门书的解释 repr str:

  1. repr: formal string representation of a Python object
  2. str: informal string representation of a Python object,或者说 printable string representation

首先 repr 是 representation 的意思,一个是正式,另一个是非正式,看起来 reprstr 显得重要些。

对于内置的 Python 对象我们可以用 repr, print, 和 str 函数,如针对 list 类型

>>> repr([1,2])
'[1, 2]'
>>> print([1,2])
[1, 2]
>>> str([1,2])
'[1, 2]'

但是具体上面三个函数中分别调用了 list 的什么方法就不可而知了,这时候定义一个自己的类最能说明问题。测试环境为 IntelliJ, 以调试截图来说明分别为 __str__ __repr__ 几种组合情况

只定义了 __str__ 方法

Python 的 __str__ 和 __repr__ 方法对比

说明:在只定义了 __str__ 方法的情况下

  1. 调试时 IntelliJ 在行内显示对象为 __str__ 的输出,但变量窗口中显示的是默认的 __repr__ 的输出
  2. repr 始终坚持调用默认的 __repr__ 方法
  3. str 转型函数调用了 __str__ 方法
  4. print 调用了 __str__ 方法

只定义了 __repr__ 方法

Python 的 __str__ 和 __repr__ 方法对比

说明:在只定义了 __repr__ 方法的情况下,可以看出 __repr__ 方法极其强势,它垄断了一切的调用,repr, str, 和 print 函数,甚至是 IntelliJ 的调试显示都必须以 __repr__ 方法为核心。

  1. 以上所有的情况都是调用 __repr__ 方法,没得选择

同时定义了 __repr__ 和 __str__ 方法

Python 的 __str__ 和 __repr__ 方法对比

说明:在同时定义了 __repr__ __str__ 方法的情况下,__str__ 方法反而能扳回来。除了明确的 repr 会调用 __repr__ 方法,和调试时变量窗口中显示对象会调用 __repr__ 方法外,其他时候都是 __str__ 占优。具体为

  1. repr 和 IntelliJ 调试时变量窗口显示变量调用 __repr__ 方法
  2. IntelliJ 调试时行内显示变量调用了 __str__ 方法
  3. str 转型操作调用了对象的 __str__ 方法,这不能解释为 informal 非正式的
  4. print 调用了 __str__ 来获得对象输出字符串

另外,格式化字符串时的调用的对象方法与 print 时是一样的,例如下面的格式化代码

f1 = "%s" % t
f2 = "{}".format(t)

Python 不知道像 Java 那样由字符串加上一个对象

"this is " + t #Java 中会展开为 "this is " + t.toString()

Python 会报以下错误

TypeError: can only concatenate str (not "Test") to str

说这里的 + 号只能连接两个字符串,除非定义了 __add__ __radd__ 方法,对应关系分别为

t = Test()
z1 = 'hello' + t #相当于 t.__radd__('hello')
z2 = t + 'hello' #相当于 t.__add__('hello')

Python 的 __xyz__ 也挺魔幻的。

以上就是Python 的 __str__ 和 __repr__ 方法对比的详细内容,更多关于Python __str__ 和 __repr__ 的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
详解Python迭代和迭代器
Mar 28 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
python实现自动登录后台管理系统
Oct 18 Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 Python
如何在Django中设置定时任务的方法示例
Jan 18 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
Python寻找路径和查找文件路径的示例
Jul 10 Python
python是否适合网页编程详解
Oct 04 Python
wxPython实现画图板
Aug 27 Python
python读取hdfs上的parquet文件方式
Jun 06 Python
基于Python采集爬取微信公众号历史数据
Nov 27 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 Python
Python datetime 如何处理时区信息
Sep 02 #Python
浅析python中的del用法
Sep 02 #Python
浅析NumPy 切片和索引
Sep 02 #Python
详解Python 函数参数的拆解
Sep 02 #Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
Sep 02 #Python
python 常用日期处理-- datetime 模块的使用
Sep 02 #Python
详解Python中的路径问题
Sep 02 #Python
You might like
PHP文件下载类
2006/12/06 PHP
php生成短网址示例
2014/05/05 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
PHP面向对象程序设计之对象的遍历操作示例
2019/06/12 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
javascript之bind使用介绍
2011/10/09 Javascript
JavaScript核心语法总结(推荐)
2016/06/02 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
javascript数组去重常用方法实例分析
2017/04/11 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
KnockoutJS数组比较算法实例详解
2019/11/25 Javascript
Python编码类型转换方法详解
2016/07/01 Python
Python 递归函数详解及实例
2016/12/27 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
2018/02/26 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
python打开使用的方法
2019/09/30 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
美国办公用品购物网站:Quill.com
2016/09/01 全球购物
美国滑雪板和装备购物网站:Skis.com
2018/12/20 全球购物
巴西手表购物网站:eclock
2019/03/19 全球购物
高中数学教师求职信
2013/10/30 职场文书
个性发展自我评价
2014/02/11 职场文书
答谢词范文
2015/01/05 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
学习党史心得体会2016
2016/01/23 职场文书
致毕业季:你如何做好自己的职业生涯规划书?
2019/07/01 职场文书