阅读到 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__ 方法
说明:在只定义了 __str__
方法的情况下
- 调试时 IntelliJ 在行内显示对象为
__str__
的输出,但变量窗口中显示的是默认的__repr__
的输出 repr
始终坚持调用默认的__repr__
方法str
转型函数调用了__str__
方法print
调用了__str__
方法
只定义了 __repr__ 方法
说明:在只定义了 __repr__
方法的情况下,可以看出 __repr__
方法极其强势,它垄断了一切的调用,repr
, str
, 和 print
函数,甚至是 IntelliJ 的调试显示都必须以 __repr__
方法为核心。
- 以上所有的情况都是调用 __repr__ 方法,没得选择
同时定义了 __repr__ 和 __str__ 方法
说明:在同时定义了 __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__ 的资料请关注其它相关文章!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 《暗喻幻想》顺风耳作用介绍
- 崔健1985-梦中的倾诉[再版][WAV+CUE]
- 黄子馨《追星Xin的恋人们2》HQ头版限量编号[WAV+CUE]
- 孟庭苇《情人的眼泪》开盘母带[低速原抓WAV+CUE]
- 孙露《谁为我停留HQCD》[低速原抓WAV+CUE][1.1G]
- 孙悦《时光音乐会》纯银CD[低速原抓WAV+CUE][1.1G]
- 任然《渐晚》[FLAC/分轨][72.32MB]
- 英雄联盟新英雄安蓓萨上线了吗 新英雄安蓓萨技能介绍
- 魔兽世界奥杜尔竞速赛什么时候开启 奥杜尔竞速赛开启时间介绍
- 无畏契约CGRS准星代码多少 CGRS准星代码分享一览
- 张靓颖.2012-倾听【少城时代】【WAV+CUE】
- 游鸿明.1999-五月的雪【大宇国际】【WAV+CUE】
- 曹方.2005-遇见我【钛友文化】【WAV+CUE】
- Unity6引擎上线:稳定性提升、CPU性能最高提升4倍
- 人皇Sky今日举行婚礼!电竞传奇步入新篇章