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 当前全局变量和入口参数的所有属性
Jul 01 Python
python的id()函数介绍
Feb 10 Python
探究Python的Tornado框架对子域名和泛域名的支持
May 02 Python
python利用lxml读写xml格式的文件
Aug 10 Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
Django 用户认证组件使用详解
Jul 23 Python
python用match()函数爬数据方法详解
Jul 23 Python
Python Web框架之Django框架Form组件用法详解
Aug 16 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
如何用python清洗文件中的数据
Jun 18 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 Sql Server连接失败问题及解决办法
2009/08/07 PHP
PHP优于Node.js的五大理由分享
2012/09/15 PHP
在PHP中使用redis
2013/11/04 PHP
php实现文件下载实例分享
2014/06/02 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
javascript 类定义的4种方法
2009/09/12 Javascript
javascript 鼠标拖动图标技术
2010/02/07 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
关于js内存泄露的一个好例子
2013/12/09 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
使用Python下载Bing图片(代码)
2013/11/07 Python
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
详解Python的单元测试
2015/04/28 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
win10下tensorflow和matplotlib安装教程
2018/09/19 Python
利用python实现逐步回归
2020/02/24 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
客服实习的个人自我鉴定
2013/10/20 职场文书
师德演讲稿范文
2014/05/06 职场文书
校园环保建议书
2014/05/14 职场文书
小学生节水倡议书
2015/04/29 职场文书
素质拓展训练感想
2015/08/07 职场文书
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL
MySQL数据库Innodb 引擎实现mvcc锁
2022/05/06 MySQL
基于Python编写一个监控CPU的应用系统
2022/06/25 Python