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执行等待程序直到第二天零点的方法
Apr 23 Python
浅析Python的Django框架中的Memcached
Jul 23 Python
Python中shutil模块的学习笔记教程
Apr 04 Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 Python
Python之使用adb shell命令启动应用的方法详解
Jan 07 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
python logging日志模块原理及操作解析
Oct 12 Python
简单介绍django提供的加密算法
Dec 18 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
Django框架之中间件MiddleWare的实现
Dec 30 Python
Python使用configparser读取ini配置文件
May 25 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
中国第一家无线电行
2021/03/01 无线电
php UTF8 文件的签名问题
2009/10/30 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
js模拟C#中List的简单实例
2014/03/06 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
jquery插件hiAlert实现网页对话框美化
2015/05/03 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
Jquery实现纵向横向菜单
2016/01/24 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
用Vue.js在浏览器中实现裁剪图像功能
2019/06/18 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
2020/10/29 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
python清除指定目录内所有文件中script的方法
2015/06/30 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
Python实现EXCEL表格的排序功能示例
2019/06/25 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
Python 没有main函数的原因
2020/07/10 Python
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
英国现代绅士品牌:Hackett
2017/12/17 全球购物
养殖人员的创业计划书范文
2013/12/26 职场文书
2014年三万活动总结
2014/04/26 职场文书
纪检监察建议书
2014/05/19 职场文书
选秀节目策划方案
2014/06/06 职场文书
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript