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的list相关知识(推荐)
Aug 30 Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 Python
NetworkX之Prim算法(实例讲解)
Dec 22 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
解决pycharm 误删掉项目文件的处理方法
Oct 22 Python
python pytest进阶之conftest.py详解
Jun 27 Python
python匿名函数用法实例分析
Aug 03 Python
利用Python复制文件的9种方法总结
Sep 02 Python
python爬虫 Pyppeteer使用方法解析
Sep 28 Python
python、PyTorch图像读取与numpy转换实例
Jan 13 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 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
PHP4.04简明安装
2006/10/09 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
自用js开发框架小成 学习js的朋友可以看看
2010/11/16 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
Vue Element 分组+多选+可搜索Select选择器实现示例
2018/07/23 Javascript
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
[49:59]KG vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python3将视频流保存为本地视频文件
2018/06/20 Python
浅谈Python中函数的定义及其调用方法
2019/07/19 Python
python读写csv文件的方法
2019/08/13 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
python可迭代对象去重实例
2020/05/15 Python
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
软件测试有哪些?什么是配置项?
2012/02/12 面试题
酒店保洁主管岗位职责
2013/11/28 职场文书
工程采购员岗位职责
2014/03/09 职场文书
应届大专生求职信
2014/06/26 职场文书
烟台的海导游词
2015/02/02 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS
python中的装饰器该如何使用
2021/06/18 Python
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android