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下Fabric的简单部署方法
Jul 14 Python
Python实现Linux的find命令实例分享
Jun 04 Python
python自动化报告的输出用例详解
May 30 Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 Python
Python基本socket通信控制操作示例
Jan 30 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
简单了解python中对象的取反运算符
Jul 01 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
Apr 08 Python
Python ORM框架Peewee用法详解
Apr 29 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
May 15 Python
Python 执行矩阵与线性代数运算
Aug 01 Python
我对PyTorch dataloader里的shuffle=True的理解
May 20 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
PHP similar_text 字符串的相似性比较函数
2010/05/26 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
PHP实现的策略模式示例
2019/03/20 PHP
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
python实现根据图标提取分类应用程序实例
2014/09/28 Python
深入理解NumPy简明教程---数组1
2016/12/17 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
python 实现端口扫描工具
2020/12/18 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
攀岩、滑雪、徒步旅行装备:Black Diamond Equipment
2019/08/16 全球购物
50道外企软件测试面试题
2014/08/18 面试题
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
酒吧创业计划书
2014/01/18 职场文书
信息总监管理职责范本
2014/03/08 职场文书
机关出纳岗位职责
2014/04/03 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang