本篇文章给大家分享的是有关Python中的__str__方法和__repr__方法的区别有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
阅读到字符串中关于转换对象为字符串的内容,介绍了repr 代码> <代码>函数,趁着还没有真正了解Python面向对象的生疏与热度,感性上理解一下repr 代码> <代码>与<代码> str 代码>这两个函数的区别。
Python的全局方法repr 代码> <代码>和<代码> str> 代码会映射到对象的__repr__和__str__的方法调用,还有<代码> str (obj)> 代码时会调用哪个方法,以及<代码>打印(obj)> 代码和调试Python代码时的对象显示会调用哪个方法呢?这就是本文想要印证的内容。
恰如Java的<代码> System.out.println (obj) 代码>或<代码>“hello"+ obj> 代码都会调用Java对象的<代码> toString() 代码>方法,那么Python中是怎么一回事呢?
来自某本Python入门书的解释repr 代码> <代码>和<代码> str 代码>:
- <李> repr:正式的Python对象的字符串表示李> <李> str:非正式的Python对象的字符串表示,或者说可打印字符串表示
李,>
首先repr 代码> <代码>是代表的意思,一个是正式,另一个是非正式,看起来repr 代码> <代码>比<代码> str> 代码显得重要些。
对于内置的Python对象我们可以用repr 代码>,<代码> <代码>打印代码>,和<代码> str 代码>函数,如针对<代码> 代码>列表类型
在祝辞祝辞repr ([1,2]) & # 39;[1,2]& # 39; 在在在打印([1,2]) [1,2] 在在在str ([1,2]) & # 39;[1,2]& # 39;
但是具体上面三个函数中分别调用了列表的什么方法就不可而知了,这时候定义一个自己的类最能说明问题。测试环境为IntelliJ,以调试截图来说明分别为<代码> __str__ 代码>和<代码> __repr__ 代码>几种组合情况
<强>只定义了__str__方法强>
说明:在只定义了<代码> __str__ 代码>方法的情况下
- <李>调试时IntelliJ在行内显示对象为<代码> __str__> 代码的输出,但变量窗口中显示的是默认的<代码> __repr__> 代码的输出李> <李> <代码> repr 代码>始终坚持调用默认的<代码> __repr__ 代码>方法李> <李> <代码> str> 代码转型函数调用了<代码> __str__ 代码>方法李> <李> <代码> 代码>调打印用了<代码> __str__ 代码>方法李>
<强>只定义了__repr__方法强>
说明:在只定义了<代码> __repr__ 代码>方法的情况下,可以看出<代码> __repr__ 代码>方法极其强势,它垄断了一切的调用,repr 代码>,<代码> <代码> str 代码>,和<代码> 代码>打印函数,甚至是IntelliJ的调试显示都必须以<代码> __repr__ 代码>方法为核心。
- <李>以上所有的情况都是调用__repr__方法,没得选择
李,>
<强>同时定义了__repr__和__str__方法强>
说明:在同时定义了<代码> __repr__ 代码>和<代码> __str__ 代码>方法的情况下,<代码> __str__ 代码>方法反而能扳回来。除了明确的<代码> repr> 代码会调用<代码> __repr__ 代码>方法,和调试时变量窗口中显示对象会调用<代码> __repr__ 代码>方法外,其他时候都是<代码> __str__ 代码>占优。具体为
- <李> repr和IntelliJ调试时变量窗口显示变量调用__repr__方法李> <李> IntelliJ调试时行内显示变量调用了__str__方法李> <李> str转型操作调用了对象的__str__方法,这不能解释为非正式非正式的李> <李>打印调用了__str__来获得对象输出字符串
李,>
另外,格式化字符串时的调用的对象方法与<代码> 代码>打印时是一样的,例如下面的格式化代码
Python不知道像Java那样由字符串加上一个对象
,这是“;+ t # Java中会展开为“这是“;+ t.toString ()Python会报以下错误
TypeError:可以> t=测试() z1=& # 39;你好# 39;+ t #相当于t.__radd__(& # 39;你好# 39;) z2=t + & # 39;你好# 39;#相当于t.__add__(& # 39;你好# 39;)
Python中的__str__方法和__repr__方法的区别有哪些