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交换变量
Sep 06 Python
解决python文件字符串转列表时遇到空行的问题
Jul 09 Python
selenium+python 去除启动的黑色cmd窗口方法
May 22 Python
网红编程语言Python将纳入高考你怎么看?
Jun 07 Python
Python判断变量名是否合法的方法示例
Jan 28 Python
Python 依赖库太多了该如何管理
Nov 08 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 Python
详解python常用命令行选项与环境变量
Feb 20 Python
Python 生成VOC格式的标签实例
Mar 10 Python
VScode连接远程服务器上的jupyter notebook的实现
Apr 23 Python
Numpy 多维数据数组的实现
Jun 18 Python
OpenCV绘制圆端矩形的示例代码
Aug 30 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中批量替换文件名的实现代码
2011/07/20 PHP
php读取mysql的简单实例
2014/01/15 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
PHP设计模式之注册树模式分析
2018/01/26 PHP
javascript:以前写的xmlhttp池,代码
2008/05/18 Javascript
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
详解Angular5路由传值方式及其相关问题
2018/04/28 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
PyQt5实现下载进度条效果
2018/04/19 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
META-INF文件夹中的MANIFEST.MF的作用
2016/06/21 面试题
信息技术教学反思
2014/02/12 职场文书
班长竞选演讲稿
2014/04/24 职场文书
个人整改方案范文
2014/10/25 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
工作服管理制度范本
2015/08/06 职场文书
高效课堂教学反思
2016/02/24 职场文书
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
Java字符串逆序方法详情
2022/03/21 Java/Android