python中的str方法和repr方法_Python 的 __str__ 和 __repr__ 方法对比

阅读到 Strings 中关于转换对象为字符串的内容,介绍了 repr 函数,趁着还没有真正了解 Python 面向对象的生疏与热度,感性上理解一下 repr 与 str 这两个函数的区别。

Python 的全局方法 repr 和 str 会映射到对象的 __repr__ 和 __str__ 的方法调用,还有 str(obj) 时会调用哪个方法,以及 print(obj) 和调试 Python 代码时的对象显示会调用哪个方法呢?这就是本文想要印证的内容。

恰如 Java 的 System.out.println(obj) 或"hello" + obj都会调用 Java 对象的 toString()方法,那么 Python 中是怎么一回事呢?

来自某本 Python 入门书的解释repr和 str:

repr: formal string representation of a Python object

str: informal string representation of a Python object,或者说 printable string representation

首先repr是 representation 的意思,一个是正式,另一个是非正式,看起来 repr 比 str 显得重要些。

对于内置的 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__ 方法

arprusjouad.jpg

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

调试时 IntelliJ 在行内显示对象为__str__的输出,但变量窗口中显示的是默认的__repr__的输出

repr始终坚持调用默认的__repr__方法

str 转型函数调用了 __str__方法

print调用了 __str__方法

只定义了 __repr__ 方法

4wma3pkgsdd.jpg

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

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

同时定义了 __repr__ 和 __str__ 方法

ihmwlopcef0.jpg

说明:在同时定义了 __repr__和 __str__方法的情况下,__str__方法反而能扳回来。除了明确的 repr 会调用 __repr__方法,和调试时变量窗口中显示对象会调用 __repr__方法外,其他时候都是 __str__ 占优。具体为

repr 和 IntelliJ 调试时变量窗口显示变量调用 __repr__ 方法

IntelliJ 调试时行内显示变量调用了 __str__ 方法

str 转型操作调用了对象的 __str__ 方法,这不能解释为 informal 非正式的

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__ 的资料请关注聚米学院其它相关文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值