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 pymongo模块用法示例
Mar 31 Python
python模块smtplib学习
May 22 Python
Python 新建文件夹与复制文件夹内所有内容的方法
Oct 27 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
Apr 16 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 Python
对Django 转发和重定向的实例详解
Aug 06 Python
Django实现auth模块下的登录注册与注销功能
Oct 10 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
Python实现AI自动抠图实例解析
Mar 05 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 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/03 冲泡冲煮
提高PHP编程效率的方法
2013/11/07 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
PHP实现生成唯一会员卡号
2015/08/24 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
accesskey 提交
2006/06/26 Javascript
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
js跨域和ajax 跨域问题的实现思路
2009/09/05 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/03 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
JavaScript模拟实现键盘打字效果
2015/06/29 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
Async Validator 异步验证使用说明
2017/07/03 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
2018/01/08 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
Python判断Abundant Number的方法
2015/06/15 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
Python实现端口检测的方法
2018/07/24 Python
python使用多进程的实例详解
2018/09/19 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
博士生求职信
2014/07/06 职场文书
四风对照检查材料思想汇报
2014/09/20 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书