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的lambda匿名函数的简单介绍
Apr 25 Python
Python操作列表的常用方法分享
Feb 13 Python
利用Python自动监控网站并发送邮件告警的方法
Aug 24 Python
python中正则表达式的使用方法
Feb 25 Python
python构建深度神经网络(DNN)
Mar 10 Python
linux环境中没有网络怎么下载python
Jul 07 Python
python属于跨平台语言码
Jun 09 Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 Python
Python中lru_cache的使用和实现详解
Jan 25 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Jun 11 Python
python基础之函数的定义和调用
Oct 24 Python
Python中递归以及递归遍历目录详解
Oct 24 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
11个PHP 分页脚本推荐
2011/08/15 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
微信小程序支付前端源码
2018/08/29 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
深入了解js原型模式
2019/05/30 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
微信小程序实现吸顶效果
2020/01/08 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
python实现停车管理系统
2018/11/30 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
室内设计专业个人的自我评价
2013/12/18 职场文书
运动会通讯稿500字
2014/02/20 职场文书
《颐和园》教学反思
2014/02/26 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
小学课外阅读总结
2014/07/09 职场文书
管理人员岗位职责
2015/02/14 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
2016庆祝国庆67周年宣传语
2015/11/25 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python