Python 的 __str__ 和 __repr__ 方法对比

 更新时间:2020年09月02日 11:31:18   作者:Yanbin  
这篇文章主要介绍了Python 的 __str__ 和 __repr__ 方法的相关资料,帮助大家区分__str__ 和 __repr__ ,感兴趣的朋友可以了解下

阅读到 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__ 方法

说明:在只定义了 __str__ 方法的情况下

  1. 调试时 IntelliJ 在行内显示对象为 __str__ 的输出,但变量窗口中显示的是默认的 __repr__ 的输出
  2. repr 始终坚持调用默认的 __repr__ 方法
  3. str 转型函数调用了 __str__ 方法
  4. print 调用了 __str__ 方法

只定义了 __repr__ 方法

说明:在只定义了 __repr__ 方法的情况下,可以看出 __repr__ 方法极其强势,它垄断了一切的调用,repr, str, 和 print 函数,甚至是 IntelliJ 的调试显示都必须以 __repr__ 方法为核心。

  1. 以上所有的情况都是调用 __repr__ 方法,没得选择

同时定义了 __repr__ 和 __str__ 方法

说明:在同时定义了 __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之京东商品秒杀的实现示例

    这篇文章主要介绍了Python之京东商品秒杀的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • apache部署python程序出现503错误的解决方法

    apache部署python程序出现503错误的解决方法

    这篇文章主要给大家介绍了关于在apahce部署python程序出现503错误的解决方法,文中通过示例代码介绍的非常详细,对同样遇到这个问题的朋友们具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-07-07
  • Python sqrt()函数用法说明

    Python sqrt()函数用法说明

    这篇文章主要介绍了Python sqrt()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python 异步之如何获取当前和正在运行任务详解

    Python 异步之如何获取当前和正在运行任务详解

    这篇文章主要为大家介绍了Python 异步之如何获取当前和正在运行任务详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 使用Python解析JSON的实现示例

    使用Python解析JSON的实现示例

    本文主要介绍了使用Python解析JSON的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Python机器学习工具scikit-learn的使用笔记

    Python机器学习工具scikit-learn的使用笔记

    这篇文章主要介绍了Python机器学习工具scikit-learn的使用笔记,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-01-01
  • 学会用Python实现滑雪小游戏,再也不用去北海道啦

    学会用Python实现滑雪小游戏,再也不用去北海道啦

    Python除了极少的事情不能做之外,其他基本上可以说全能.,图形处理、文本处理、数据库编程、网络编程、web编程、黑客编程、爬虫编写、机器学习、人工智能等.接下来我就教大家做一个不用去北海道也可以滑雪的小游戏,需要的朋友可以参考下
    2021-05-05
  • pyqt5、qtdesigner安装和环境设置教程

    pyqt5、qtdesigner安装和环境设置教程

    这篇文章主要介绍了pyqt5、qtdesigner安装和环境设置方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 浅析Python模块之间的相互引用问题

    浅析Python模块之间的相互引用问题

    这篇文章主要介绍了Python模块之间的相互引用问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Python正则表达式匹配中文用法示例

    Python正则表达式匹配中文用法示例

    这篇文章主要介绍了Python正则表达式匹配中文用法,结合实例形式分析了Python针对中文的正则与文件操作相关技巧,需要的朋友可以参考下
    2017-01-01

最新评论