首页 > Python > 在Python里__str__和__repr__有什么区别?

在Python里__str__和__repr__有什么区别?

上一篇 下一篇

网友问题:
Python 有什么区别?__str____repr__

分割线

网友回答:

我的经验法则是:面向开发人员,面向客户。__repr____str__

分割线
网友回答:

除非您特别采取行动以确保其他情况,否则大多数类都没有有用的结果:

>>> class Sic(object): pass
... 
>>> print(str(Sic()))
<__main__.Sic object at 0x8b7d0>
>>> print(repr(Sic()))
<__main__.Sic object at 0x8b7d0>
>>> 

As you see — no difference, and no info beyond the class and object’s . If you only override one of the two…:id

>>> class Sic(object): 
...   def __repr__(self): return 'foo'
... 
>>> print(str(Sic()))
foo
>>> print(repr(Sic()))
foo
>>> class Sic(object):
...   def __str__(self): return 'foo'
... 
>>> print(str(Sic()))
foo
>>> print(repr(Sic()))
<__main__.Sic object at 0x2617f0>
>>> 

如您所见,如果您覆盖 ,那也用于 ,但反之亦然。__repr____str__

其他需要了解的关键花絮:在内置容器上使用 ,而不是 ,用于它包含的项目。而且,尽管在典型的文档中发现了关于该主题的文字,但几乎没有人费心使对象成为可用于构建相等对象的字符串(这太难了,并且不知道相关模块实际上是如何导入的,实际上是不可能的)。__str____repr____str____repr__eval

所以,我的建议是:专注于使人类可读的合理性,并尽可能明确,即使这会干扰模糊的无法实现的目标,即使使 的返回值可以作为输入!__str____repr____repr____eval__

分割线

网友回答:

亚历克斯总结得很好,但令人惊讶的是,它太简洁了。

首先,让我重申一下亚历克斯帖子中的要点:

  • 默认实现是无用的(很难想到一个不会的,但是是的)
  • __repr__目标是明确
  • __str__目标是可读性
  • 容器使用包含的对象__str____repr__

默认实现无用

这主要是一个惊喜,因为Python的默认值往往相当有用。但是,在这种情况下,具有默认值将如下所示:__repr__

return "%s(%r)" % (self.__class__, self.__dict__)

会太危险了(例如,如果对象相互引用,则太容易进入无限递归)。所以Python应付了。请注意,有一个默认值为 true:如果已定义,则未定义,则对象的行为将好像 .__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 的格式:。这并不意味着你实际上可以构造 MyClass,或者这些是正确的构造函数参数——但它是一种有用的形式来表达“这是你需要知道的关于这个实例的一切”。eval(repr(c))==ccc"MyClass(this=%r,that=%r)" % (self.this,self.that)

注意:我在上面使用了,而不是.你总是想在实现中使用[或格式化字符,等效地],否则你就违背了repr的目标。您希望能够区分和 .%r%srepr()%r__repr__MyClass(3)MyClass("3")

__str__的目标是可读性

具体来说,它并不打算是明确的 — 请注意。同样,如果你实现了一个IP抽象,让它的str看起来像192.168.1.1就好了。实现日期/时间抽象时,str 可以是“2010/4/12 15:35:22”等。目标是以用户(而不是程序员)想要阅读它的方式表示它。砍掉无用的数字,假装是其他类——只要它支持可读性,它就是一种改进。str(3)==str("3")

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

这似乎令人惊讶,不是吗?它有点,但如果它使用他们的?__str__

[moshe is, 3, hello
world, this is a list, oh I don't know, containing just 4 elements]

不是很。具体来说,容器中的字符串会发现太容易干扰其字符串表示。面对模棱两可,请记住,Python会抵制猜测的诱惑。如果您希望在打印列表时出现上述行为,只需

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

(您可能还可以弄清楚如何处理字典。

总结

实现任何你实现的类。这应该是第二天性。如果您认为拥有一个在可读性方面出错的字符串版本会很有用,请实现。__repr____str__

模板简介:该模板名称为【在Python里__str__和__repr__有什么区别?】,大小是暂无信息,文档格式为.html,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 188次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 html
  • 文件大小 暂无信息
  • 上传时间 02-07
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信公众平台 微信文章 微信模板 html5 自适应 微信图片 单页式简历模板 响应式 微信素材 企业网站
您可能会喜欢的其他模板