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搭建微信公众平台
Feb 09 Python
python中子类调用父类函数的方法示例
Aug 18 Python
Python机器学习之决策树算法实例详解
Dec 06 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
PyTorch学习笔记之回归实战
May 28 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
django使用admin站点上传图片的实例
Jul 28 Python
pytorch 预训练层的使用方法
Aug 20 Python
Python importlib动态导入模块实现代码
Apr 16 Python
opencv 阈值分割的具体使用
Jul 08 Python
深入了解Python装饰器的高级用法
Aug 13 Python
Python-OpenCV实现图像缺陷检测的实例
Jun 11 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
PHP的mysqli_select_db()函数讲解
2019/01/23 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2021/03/09 PHP
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
2016/07/12 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
详解Angular Karma测试的持续集成实践
2019/11/15 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Django 配置多站点多域名的实现步骤
2019/05/17 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
python多进程重复加载的解决方式
2019/12/13 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
python实现与redis交互操作详解
2020/04/21 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
世界上最大的折扣香水店:FragranceNet.com
2016/10/26 全球购物
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
教育孩子心得体会
2014/01/01 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
2014年人大工作总结
2014/12/10 职场文书
先进工作者申报材料
2014/12/23 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
2015年度个人业务工作总结
2015/04/27 职场文书
大学考试作弊检讨书
2015/05/06 职场文书