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 相关文章推荐
使用C#配合ArcGIS Engine进行地理信息系统开发
Feb 19 Python
python导入时小括号大作用
Jan 10 Python
python2.7 mayavi 安装图文教程(推荐)
Jun 22 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
Feb 18 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
itchat-python搭建微信机器人(附示例)
Jun 11 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
用python求一重积分和二重积分的例子
Dec 06 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
python之语音识别speech模块
Sep 09 Python
Python 实现国产SM3加密算法的示例代码
Sep 21 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初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
超级退弹代码
2008/07/07 Javascript
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
使用Python和xlwt向Excel文件中写入中文的实例
2018/04/21 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
python 两个数据库postgresql对比
2019/10/21 Python
Python requests设置代理的方法步骤
2020/02/23 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
Linux机考试题
2015/10/16 面试题
大专应届生个人简历的自我评价
2013/10/15 职场文书
学校司机岗位职责
2013/11/14 职场文书
党课学习思想汇报
2014/01/02 职场文书
大学新生欢迎词
2014/01/10 职场文书
自我鉴定 电子商务专业
2014/01/30 职场文书
孔庙导游词
2015/02/04 职场文书
上诉答辩状范文
2015/05/22 职场文书
学校安全管理制度
2015/08/06 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python