第8.17节 Python __repr__方法和__str__方法、内置函数repr和str的异同点对比剖析

一、 引言
记得刚开始学习Python学习字符串相关内容的时候,查了很多资料,也做了些测试,对repr和str这两个函数的返回值老猿一直没有真正理解,因为测试发现这两个函数基本上输出时一样的。到现在老猿也不能说自己掌握Python的基础知识了,但到现在至少能说清楚repr和str这两个函数分别是干什么用的了。
前面几章分别介绍了__repr__方法和__str__方法的语法、作用、重写,并间或的进行了两者的一些关系说明,他们其实还对应了两个功用与方法一模一样的Python内置函数repr和str。本节对这两个方法进行一个对比分析,力争让看到本章节的你能很快弄明白二者的区别。
由于str内置函数与__str__方法功能相同,repr函数和__repr__方法功能相同,且这两个内置函数实际上就是调用类的这两个方法,为了说明简便,我们就不单独进行函数对比分析。

二、 __str__和 __repr__函数对比分析

  1. 二者的目的不同,__str__是为了给最终用户提供实例对象的信息,__repr__是给开发人员提供对象的信息;
  2. 由于目的不同,二者展示的信息应该不同,__str__应该提供用户容易理解的信息,将属性代码翻译成客户理解的文字说明,__repr__应该提供开发者容易使用的信息,最好是能够直接使用输出的信息直接拷贝部分或全部就能重定义一个对象,这些信息类似于集成环境下debug看内存数据对象的格式差不多;
  3. 二者触发调用的方式不同,__str__是在print(对象)、str(对象)等情况下调用,__repr__是在查看对象、repr(对象)等情况下调用;
  4. 当没有重写__str__方法但重写了__repr__方法时,触发调用__str__方法实际上就是调用__repr__方法。
    1>老猿认为,这是由于没有重写__str__方法时,__str__方法就是从父类继承的,而所有类的父类object应该是在__str__方法中直接调用了__repr__方法,导致自定义类继承的__str__方法中也是调用__repr__方法,而__repr__方法重写了,所以才是这样的结果。但以上结果老猿没有去核实源码,仅是自己的分析,暂时无法证明;
    2>老猿建议各位开发者在实现自己的自定义类时,至少重写 repr 方法,这能保证类到字符串始终有一个有效的自定义转换方式,并在与客户交互的类中,提供重写的__str__方法。
  5. 部分内置类如容器(指有元素的对象)使用str(对象)返回的也是__repr__对应的字符串内容,这也是为什么在交互模式下我们输入相关变量能直接看到变量的数据;
  6. 二者都是一种比较符合Python风格的内置方法,无需显示调用方法就可以触发.

本节对前面章节介绍的关于__repr__方法和__str__方法的使用和作用进行了一个对比分析,具体这两个方法的使用还是去参考前面的章节。
老猿Python,跟老猿学Python! 博客地址:https://blog.csdn.net/LaoYuanPython