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 05 Python
Linux下使用python调用top命令获得CPU利用率
Mar 10 Python
python中的代码编码格式转换问题
Jun 10 Python
分享6个隐藏的python功能
Dec 07 Python
pytorch构建网络模型的4种方法
Apr 13 Python
Python处理中文标点符号大集合
May 14 Python
Python3实现定时任务的四种方式
Jun 03 Python
python pandas生成时间列表
Jun 29 Python
python实现的生成word文档功能示例
Aug 23 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
如何在django中添加日志功能
Feb 06 Python
Python 使用office365邮箱的示例
Oct 29 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支付宝在线支付接口开发教程
2016/09/19 PHP
让firefox支持IE的一些方法的javascript扩展函数代码
2010/01/02 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug
2016/01/10 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
详解JS函数stack size计算方法
2018/06/18 Javascript
nodejs之koa2请求示例(GET,POST)
2018/08/07 NodeJs
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
微信小程序http连接访问解决方案的示例
2018/11/05 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
Python对象类型及其运算方法(详解)
2017/07/05 Python
Gauss-Seidel迭代算法的Python实现详解
2019/06/29 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Python实现从N个数中找到最大的K个数
2020/04/02 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
世界上最好的足球商店:Unisport
2019/03/02 全球购物
教师求职信范文分享
2013/12/27 职场文书
信访工作经验交流材料
2014/05/23 职场文书
迎新生标语大全
2014/10/06 职场文书
2014年节能工作总结
2014/12/18 职场文书
党员自我评价2015
2015/03/03 职场文书
Mysql数据库group by原理详解
2022/07/07 MySQL