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代码(逐级优化)
May 25 Python
简单总结Python中序列与字典的相同和不同之处
Jan 19 Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 Python
使用Python & Flask 实现RESTful Web API的实例
Sep 19 Python
Python 找到列表中满足某些条件的元素方法
Jun 26 Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
python使用自定义钉钉机器人的示例代码
Jun 24 Python
TensorFlow2.0使用keras训练模型的实现
Feb 20 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中返回引用类型的方法
2015/04/03 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
jQuery动态添加的元素绑定事件处理函数代码
2011/08/02 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
Python数组定义方法
2016/04/13 Python
独特的python循环语句
2016/11/20 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
使用Python制作自动推送微信消息提醒的备忘录功能
2018/09/06 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
Python assert语句的简单使用示例
2019/07/28 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
外贸主管求职简历的自我评价
2013/10/23 职场文书
书香校园活动方案
2014/02/28 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
心理学专业求职信
2014/06/16 职场文书
工程质检员岗位职责
2015/04/08 职场文书
Python中三种花式打印的示例详解
2022/03/19 Python