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备份文件以及mysql数据库的脚本代码
Jun 10 Python
python使用nntp读取新闻组内容的方法
May 08 Python
python脚本内运行linux命令的方法
Jul 02 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
机器学习之KNN算法原理及Python实现方法详解
Jul 09 Python
对Python闭包与延迟绑定的方法详解
Jan 07 Python
Django REST Framework序列化外键获取外键的值方法
Jul 26 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
Python 分发包中添加额外文件的方法
Aug 16 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
Jan 10 Python
利用python绘制数据曲线图的实现
Apr 09 Python
Python实现加密接口测试方法步骤详解
Jun 05 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
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
PHP动态变静态原理
2006/11/25 PHP
php中实现记住密码自动登录的代码
2011/03/02 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
浅谈PHP强制类型转换,慎用!
2013/06/06 PHP
一个简洁实用的PHP缓存类完整实例
2014/07/26 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
让textarea自动调整大小的js代码
2011/04/12 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
python处理PHP数组文本文件实例
2014/09/18 Python
python网络编程之数据传输UDP实例分析
2015/05/20 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
python中类和实例如何绑定属性与方法示例详解
2017/08/18 Python
python实现简易云音乐播放器
2018/01/04 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
《桃花心木》教学反思
2014/02/17 职场文书
学校周年庆活动方案
2014/08/22 职场文书
运动会入场词
2015/07/18 职场文书
军训通讯稿范文
2015/07/18 职场文书
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技