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在命令行下使用google翻译(带语音)
Jan 16 Python
python和C语言混合编程实例
Jun 04 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
Python实现合并两个列表的方法分析
May 28 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
Pycharm 2020年最新激活码(亲测有效)
Sep 18 Python
Django model.py表单设置默认值允许为空的操作
May 19 Python
Python API 操作Hadoop hdfs详解
Jun 06 Python
python属于软件吗
Jun 18 Python
Python实现PS滤镜中的USM锐化效果
Dec 04 Python
python实现学生通讯录管理系统
Feb 25 Python
python Protobuf定义消息类型知识点讲解
Mar 02 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
无限级别菜单的实现
2006/10/09 PHP
php 页面执行时间计算代码
2008/12/04 PHP
php之XML转数组函数的详解
2013/06/07 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
2014/07/04 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
js中将字符串转换成json的三种方式
2011/01/12 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
jquery如何通过name名称获取当前name的value值
2013/12/20 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
JavaScript实现的联动菜单特效示例
2019/07/08 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
python修改list中所有元素类型的三种方法
2018/04/09 Python
Django中间件实现拦截器的方法
2018/06/01 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
机械工程学院大学生求职信
2014/05/25 职场文书
庆六一开幕词
2015/01/29 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
浅析NIO系列之TCP
2021/06/15 Java/Android