Alex总结得很好,但是也太简洁了。

首先让我来重复下Alex的总结的要点:

缺省实现是没用的(很难说不是,但是没错)

__repr__的目标是准确性

__str__的目标是可读性

容器的__str__使用包含了对象的__repr__

无用的缺省实现

这一点令人非常惊奇,因为Python的缺省设置通常都相对比较有用。然而,在这种情况下,__repr__的缺少实现表现为如下的代码:

return"%s(%r)"%(self.__class__,self.__dict__) 这样是非常危险的(如果对象之前相互引用很容易地就进入无限递归)。所以Python不会起作用。注意有一个缺省实现的情况:如果定义了__repr__,但没有定义__str__,对象将表现为__str__=__repr__。

用简单的术语来说,这意味着:几乎你实现的所有对象都应该有一个用于理解对象的__repr__函数。实现__str__是可选的:如果你需要一个看起来较好的打印功能(比如用于产生报表).

__repr__的目标是准确性

直接了当地说,我不相信调试器。我并不确切知道如何使用任何调试器,也从来没有真正地使用过一个调试器。更进一步说,我相信调试器的大缺陷是它们的本质——我很久以前的调试发现绝大多数的失败都距真正的错误发生点很远。这使我对日志具有宗教般的热情。日志是一个正规的火灾和备份服务器系统的生命线。Python使得日志非常便于记录:利用某些项目特定的封装,你需要做的只是如下操作:

log(INFO,"I am in the weird function and a is",a,"and",b,"is",b,"but I got a null C — using default",default_c)

但你还有最后一步需要做——确定你的每一个对象都实现了一个可用的repr函数,以使那样的代码可用。这也是"eval"出现的原因:如果你有足够的信息,所以eval(repr(c))==c就表明你知道所有的信息,因此知道c。如果那个太简单,但有点令人糊涂,请试着做一下。如果没有任何问题,那么请确定你有c的所有信息。我通常使用类eval的格式:"MyClass(this=%r, that=%r)" % (self.this, self.that)。这并不是说你能准确地构建MyClass,或那是正确的构造参数——但对于解释“这是你需要知道的关于这个实例的所有信息”是非常有用的。

注意,在上面我使用了%r而不是%s。你总是想在__repr__实现中用repr()[或者用与相同的%r格式字符串],或都你不管repr的准确性目标。你只是想能够区分MyClass(3)和MyClass("3")

__str__的目标是可读性

特别说明它不特别在意准确性——注意str(3)==str("3")。类似的,你实现了一个IP地址的抽象,它很好地实现了类似192.168.1.1的str。当实现一个日期/时间抽象,str可能是“2010/4/12 15:35:22”,等等。它的目标是实现了一种使用户而不是程序员能够方便阅读的方式。去掉无用的数字,然后伪装成其它的类——只要它支持可读性,就是一种改进。

容器的__str__使用包含了对象的__repr__

这看起来有点奇怪,不是吗?但下面的代码读起来应该是怎样的呢?

[mosheis,3,hello

world,thisisa list,oh I don't know, containing just 4 elements]

不太容易。需要明确的是,在容器中的字符串会发现一种方法,可以非常容易地影响到字符串的表示。请记住,Python面对歧义时拒绝去猜测。如果当你在输出一个list的时候,你想知道以上代码的结果,只需要以下代码:

print"["+", ".join(l)+"]"

(或许你能够指出对于dictionary的结果)。

总结

在你实现的任何类里实现__repr__,这应该是第二性质。如果你认为实现一个__str__,在增加了歧义,但具有较少的错误,更好的可读性的情况下有效,那么就实现它。

python __repr__用法_Python 中 str 和 repr 的区别相关推荐

  1. python __repr__用法_python中str和repr_关于Python中repr和str用法的区别?

    我们在用Python的时候,有时候会发现在交互模式下直接输入一个变量跟输入print(变量)打印出来的东西是不一样的. 还有时候,我们打印一个对象,得到的不是我们想要的它的值,而是一个内存地址. 这些 ...

  2. python yield用法_Python中迭代器和生成器的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  3. python中的repr是什么意思_python中str和repr有什么区别

    python中str和repr有什么区别?下面给大家详细介绍: 1.内建函数str()和repr() 或反引号操作符(``)可以方便地以字符串的方式获取对象的内容.类型.数值属性等信息. 2.str( ...

  4. python str和repr的区别_python中str和repr的区别是什么

    python中str和repr的区别是什么 发布时间:2020-09-09 13:49:03 来源:亿速云 阅读:72 作者:小新 小编给大家分享一下python中str和repr的区别是什么,希望大 ...

  5. python中内置函数的用法_python中str内置函数用法总结

    大家在使用python的过程中,应该在敲代码的时候经常遇到str内置函数,为了防止大家搞混,本文整理归纳了str内置函数.1字符串查找类:find.index:2.字符串判断类:islower.isa ...

  6. Python中str和repr的区别

    str 和 repr 在 Python 中是两种不同的字符串表示方法. str 是一种用户友好的字符串表示方法,它用于显示对象的信息,通常是一个简单的字符串,可以读懂. repr 是一种程序员友好的字 ...

  7. python end用法_python中end的使用方法

    python中end的使用方法 发布时间:2020-06-17 09:47:13 来源:亿速云 阅读:178 这篇文章给大家分享的是有关python中end的使用方法,小编觉得挺实用的,因此分享给大家 ...

  8. python try用法_python中的try的用法

    展开全部 try语句32313133353236313431303231363533e78988e69d8331333431366238是python里面的控制语句,与except,finally配合 ...

  9. python map用法_Python中ChainMap的一种实用用法

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 简而言之ChainMap:将多个字典视为一个,解锁Python超能力. Python标准库中的集合模块包含 ...

最新文章

  1. 使用json-server模拟REST API
  2. Cacti+Nagios完全攻略(二)整合cacti与nagios安装部署
  3. 怎么解决深入学习PHP的瓶颈
  4. Android之Canvas的drawRoundRect()
  5. 前端学习(3294):effect hook
  6. python3生成二维码实例fromm_Python使用mqtt极简例子
  7. Android 源码查看网站分享
  8. HTML+CSS+JS制作爱心表白代码 520情人节源码HTML 七夕情人节表白代码制作 生日祝福代码
  9. 睿智的目标检测22——Keras搭建RFBnet目标检测平台
  10. IP地址、子网掩码、网络地址之间相关的计算
  11. MySQL约束和表的复杂查询操作
  12. div 自定义拉宽_纯Css实现Div高度根据自适应宽度(百分比)调整
  13. android 开发sdk 找不到java类_开发Cordova插件(Android)时找不到源Java类
  14. 工业面阵相机及镜头的选择(笔记)
  15. MacBook Pro(13 英寸,2011 年末)A1278 安装Winows11无声音问题解决(WIN10和WIN11同样的解决方法)
  16. 团队管理:新业务团队如何结合绩效来度量开发目标
  17. 51单片机课程设计《三路步进电机控制》
  18. C语言/C++常见习题问答集锦(四十三) 之持之以恒
  19. 爬取淘宝女郎的照片-写给初步入门爬虫的读者
  20. 从软件本质的角度看待软件危机

热门文章

  1. CentOS 7搭建GitLab服务器踩坑——解决Whoops, GitLab is taking too much time to respond 502 错误
  2. 西浦计算机研究生,西浦这个女生,竟然拒绝了哈佛研究生录取通知书
  3. 云计算与传统计算机的联系,云计算和超级计算机是什么关系?-通信/网络-与非网...
  4. android webview虚拟现实,WebVR in WebView
  5. Java操作redis数据库
  6. 组建比较不只有箱线图,还有这些
  7. 三角形内部整点的个数【皮克定理】
  8. 函数对称性常见公式_知识点:函数的对称性总结
  9. 网曝WPS删除用户本地文件?云安全令人担忧,还是私有化部署更安全
  10. 怎么申请港大商学院?能提前申请吗?