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 参数列表中的self 显式不等于冗余
Dec 01 Python
Python help()函数用法详解
Mar 11 Python
用Python编写web API的教程
Apr 30 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
Python命令行解析模块详解
Feb 01 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
Python中join()函数多种操作代码实例
Jan 13 Python
基于python图像处理API的使用示例
Apr 03 Python
Python 在局部变量域中执行代码
Aug 07 Python
Django生成数据库及添加用户报错解决方案
Oct 09 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 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数据库备份还原类分享
2014/03/20 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
再谈ie和firefox下的document.all属性
2009/10/21 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
Python将多个excel表格合并为一个表格
2021/02/22 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
院领导写的就业推荐信
2014/03/09 职场文书
保险公司晨会主持词
2014/03/22 职场文书
网络研修心得体会
2016/01/08 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python
浅析python中特殊文件和特殊函数
2022/02/24 Python
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers
python实现一个简单的贪吃蛇游戏附代码
2022/06/28 Python