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:formalstringrepresentationofaPythonobject
- str:informalstringrepresentationofaPythonobject,或者说printablestringrepresentation
首先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那样由字符串加上一个对象
"thisis"+t#Java中会展开为"thisis"+t.toString()
Python会报以下错误
TypeError:canonlyconcatenatestr(not"Test")tostr
说这里的+号只能连接两个字符串,除非定义了__add__和__radd__方法,对应关系分别为
t=Test() z1='hello'+t#相当于t.__radd__('hello') z2=t+'hello'#相当于t.__add__('hello')
Python的__xyz__也挺魔幻的。
以上就是Python的__str__和__repr__方法对比的详细内容,更多关于Python__str__和__repr__的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。