Python中的__str__方法和__repr__方法的区别有哪些

  介绍

本篇文章给大家分享的是有关Python中的__str__方法和__repr__方法的区别有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

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

Python的全局方法repr <代码>和<代码> str> str (obj)> 打印(obj)>

恰如Java的<代码> System.out.println (obj) 或<代码>“hello"+ obj> 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__方法

 Python中的__str__方法和__repr__方法的区别有哪些

说明:在只定义了<代码> __str__ 方法的情况下

    <李>调试时IntelliJ在行内显示对象为<代码> __str__> __repr__> <李> <代码> repr 始终坚持调用默认的<代码> __repr__ 方法 <李> <代码> str> __str__ 方法 <李> <代码> 调打印用了<代码> __str__ 方法

<强>只定义了__repr__方法

 Python中的__str__方法和__repr__方法的区别有哪些

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

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

<强>同时定义了__repr__和__str__方法

 Python中的__str__方法和__repr__方法的区别有哪些

说明:在同时定义了<代码> __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__方法的区别有哪些